MySQL数据库集群——PXC

4 篇文章 0 订阅
18 篇文章 0 订阅

MySQL数据库集群

数据库——Percona Server

安装

安装方式两种:

  1. 在线安装
    访问Percona的官网进行最新版本的安装:
    本次以写博客的时间点的最新版本安装:
    访问Percona官网
    Percona 官网
  • Installing Percona Server from Percona yum repository

    • Install the Percona repository
      You can install Percona yum repository by running the following command as a root user or with sudo:
      yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm

    • Testing the repository
      Make sure packages are now available from the repository, by executing the following command:
      yum list | grep percona
      You should see output similar to the following:

      ...
      Percona-Server-57-debuginfo.x86_64      5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-client-57.x86_64         5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-devel-57.x86_64          5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-server-57.x86_64         5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-shared-57.x86_64         5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-shared-compat-57.x86_64  5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-test-57.x86_64           5.7.10-3.1.el7                 @percona-release-x86_64
      Percona-Server-tokudb-57.x86_64         5.7.10-3.1.el7                 @percona-release-x86_64
      ...
      
    • Install the packages
      You can now install Percona Server by running:
      yum install Percona-Server-server-57

  • 离线本地安装

    • 下载Percona Server
      访问Percona最新版下载页面选择Download All Packages Together
      或者使用wget命令
      wget https://www.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.10-3/binary/redhat/7/x86_64/Percona-Server-5.7.10-3-r63dafaf-el7-x86_64-bundle.tar
      
    • 解压安装压缩包
      tar xvf Percona-Server-5.7.10-3-r63dafaf-el7-x86_64-bundle.tar
      解压完成后
      $ ls *.rpm
      
      Percona-Server-57-debuginfo-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-client-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-devel-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-server-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-shared-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-shared-compat-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-test-57-5.7.10-3.1.el7.x86_64.rpm
      Percona-Server-tokudb-57-5.7.10-3.1.el7.x86_64.rpm
      
    • 安装
      rpm -ivh *.rpm
    • 启动
      service mysql start
    • 查看运行状态
      service mysql status
    • 关闭
      service mysql stop
    • 重启
      service mysql restart

卸载

  1. 停止服务器(Stop the Percona Server service)
    service mysql stop
  2. 删除安装包(Remove the packages)
    yum remove Percona-Server*
  3. 删除数据及其配置(Remove the data and configuration files)
    rm -rf /var/lib/mysql
    rm -f /etc/my.cnf
    
    注意这将会删除所有的安装文件以及删除所有的数据文件(数据库、数据表、日志等等),如果数据重要的话请在删除之前对数据进行备份以便日后恢复。

开放系统的3306端口

firewall-cmd  --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

开放端口

修改数据库的配置文件

vim /etc/my.cnf

[mysqld]
character_set_server=utf8
bind-addredd=0.0.0.0
# 跳过DNS解析
skip-name-resolve

修改完MySQL配置后需要重启MySQL服务。

删除MySQL的自动启动

chkconfig mysqld off

之所以关闭MySQL的自动启动是因为如果在集群中的一个MySQL节点宕机重启后会自动与一个随机的节点进行数据的同步,而如果一个MySQL节点宕机时间过长,在重启之后需要同步的数据量过大会严重影响MySQL的性能,正确的做法是从其他正常的节点中拷贝数据文件到当前节点,然后再启动数据库,减少同步的数据量。

初始化MySQL数据库

  • 修改root账户的默认密码
    • 获取原始密码(系统生成的)
      cat /var/log/mysqld.log | grep "A temporary password"

      [root@localhost etc]# cat /var/log/mysqld.log | grep "A temporary password"
      2018-11-30T22:47:41.832236Z 1 [Note] A temporary password is generated for root@localhost: NhR3(r0e?9dS
      
      

      其中NhR3(r0e?9dS就是默认的初始化密码

    • 修改原始密码
      命令:mysql_secure_installation

      [root@localhost etc]# mysql_secure_installation
      
      Securing the MySQL server deployment.
      
      Enter password for user root: 
      
      The existing password for the user account root has expired. Please set a new password.
      
      New password: 
      
      Re-enter new password: 
       ... Failed! Error: Your password does not satisfy the current policy requirements
      
      New password: 
      
      Re-enter new password: 
      
      

需要注意的是这里修改的密码必须有大写、小写和数字以及符号。
后面如果有选择选Y,并且重复输入修改后的密码。

创建一个可以远程连接的密码

  1. 登录数据库
    mysql -uroot -p
  2. 添加一个远程账户
-- 创建一个用户名为root登录ip不做限制的用户,密码为:Admin123456
CREATE USER 'root'@'%' IDENTIFIED BY 'Admin123456';
-- 分配权限,*.*代表将所有的权限分配给该账户
GRANT all privileges ON *.* TO 'root'@'%';

  1. 刷新配置
    FLUSH PRIVILEGES;

找回数据库密码

  1. 修改MySQL数据库的配置文件——增加参数
    vim /etc/my.cnf
    在配置文件中添加:

    [mysqld]
    .......
    skip-grant-tables
    
  2. 重启MySQL服务
    service mysqld restart

  3. 不使用用户名密码登录MySQL数据库
    mysql
    不用添加任何参数

  4. 修改用户密码

    USE mysql;
    UPDATE user SET password=password('new-password') WHERE user = 'root';
    
  5. 刷新配置

    FLUSH PRIVILEGES;
    
  6. 修改MySQL数据库的配置文件——删除参数

    vim /etc/my.cnf
    

    将其中的skip-grant-tables删除或者注释掉

  7. 重启MySQL服务
    service mysqld restart

创建PXC集群

1. 删除MariaDB程序包

yum -y remove mari*

2. 开放防火墙端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent

3. 关闭SELINUX

vi /etc/selinux/config

把SELINUX属性值设置成disabled后重启服务器

reboot

4. 离线安装PXC

5. 创建PXC集群

  • 停止MySQL服务

    service mysql stop
    
  • 修改每个PXC节点的/etc/my.cnf文件(在不同节点上,注意调整文件内容)

    server-id=1  #PXC集群中MySQL实例的唯一ID,不能重复,必须是数字
    wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
    wsrep_cluster_name=pxc-cluster  #PXC集群的名称
    wsrep_cluster_address=gcomm://192.168.99.151,192.168.99.159,192.168.99.215
    wsrep_node_name=pxc1  #当前节点的名称
    wsrep_node_address=192.168.99.151  #当前节点的IP
    wsrep_sst_method=xtrabackup-v2  #同步方法(mysqldump、rsync、xtrabackup)
    wsrep_sst_auth= admin:Abc_123456  #同步使用的帐户
    pxc_strict_mode=ENFORCING  #同步严厉模式
    binlog_format=ROW  #基于ROW复制(安全可靠)
    default_storage_engine=InnoDB  #默认引擎
    innodb_autoinc_lock_mode=2  #主键自增长不锁表
    
  • 主节点的管理命令(第一个启动的PXC节点)

    systemctl start mysql@bootstrap.service
    systemctl stop mysql@bootstrap.service
    systemctl restart mysql@bootstrap.service
    
  • 非主节点的管理命令(非第一个启动的PXC节点)

    service start mysql
    service stop mysql
    service restart mysql
    
  • 查看PXC集群状态信息

    show status like 'wsrep_cluster%' ;
    
  • 按照上述配置方法,创建两组PXC集群

6. PXC节点启动与关闭

  • 如果最后关闭的PXC节点是安全退出的,那么下次启动要最先启动这个节点,而且要以主节点的启动方式启动
  • 如果最后关闭的PXC节点不是安全退出的,那么要先修改/var/lib/mysql/grastate.dat 文件,把其中的safe_to_bootstrap属性值设置为1,再按照主节点启动

配置MyCat负载均衡

安装MyCat准备工作

MyCat是使用Java开发的,所以在使用前需要在机器上安装好JDK,并配置好Java环境,如果使用的是yum或者apt等方式安装的,可能在其机器上还需要配置一个JAVA_HOME的环境变量。

  • 安装JDK
    • 离线安装
      前往Oracle 官网下载JDK,下载到本地,进入到下载目录
      .tar.gz文件使用tar -zxvf命令解压到你希望存放的目录(我放到了/usr/lib),编辑配置文件vim /etc/profile在文件末尾添加配置信息
      export JAVA_HOME=/usr/lib/jdk1.8
      export JAVA_BIN=$JAVA_HOME/bin
      export JAVA_LIB=$JAVA_HOME/lib
      export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
      export PATH=$JAVA_BIN:$PATH
      
      如果下载的是.rpm文件则使用yum install jdk*.rpm安装
    • 在线安装
      如果yum搜索慢,可以将源换成阿里的
      # 备份原始数据源
      mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
      # 下载Centos 7 的源
      wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
      # 更新缓存
      yum makecache
      
      使用yum或者apt搜索jdk的包名,使用yum install 包名安装,apt类似
  • 配置JAVA_HOME环境变量
    vim /etc/profile
    在文件末尾添加 export JAVA_HOME=/usr/lib/jdk1.8
    
  • 刷新配置
    source /etc/profile
    
  • 创建两个PXC集群,充当两个分片
  • 创建数据表(在两个集群中都要创建)
    -- 创建数据表,用于保存切分数据
    drop table if exists `t_user`;
    
    create table `t_user`
    (
      `id`       int(10) unsigned    not null,
      `username` varchar(200)        not null,
      `password` varchar(200)        not null,
      `tel`      char(11)            not null,
      `locked`   tinyint(1) unsigned not null default 0,
      primary key (`id`) using BTREE,
      index `idx_username` (`username`) using BTREE,
      unique index `unq_username` (`username`) using BTREE
    );
    

安装MyCat

  • 下载Mycat并解压
    Mycat官方下载链接 : http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz

    tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz 
    
  • 编辑Mycat配置文件

    文件作用修改内容
    rule.xml切分算法修改mod-long分片数量为2
    server.xml虚拟MySQL修改用户名、密码和逻辑库
    scheme.xml数据库链接、读写分离、负载均衡、数据表映射定义链接、读写分离、负载均衡、数据表映射
    • server.xml
      97行左右修改文件
      <!-- 
      	配置虚拟连接的用户名为root,密码使用123456有权限操作chen这个数据库
      -->
      <user name="root" defaultAccount="true">  
      	<property name="password">123456</property>
      	<property name="schemas">chen</property>
      </user>
      
    • scheme.xml修改比较多,建议备份原始文件,重写
      <?xml version="1.0"?>
      <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
      <mycat:schema xmlns:mycat="http://io.mycat/">
      	<!-- 配置数据表 ,定义虚拟逻辑库和虚拟逻辑表 -->
      	<!-- 
      		name:虚拟逻辑库的名字
      	-->
      	<schema name="chen" checkSQLschema="false" sqlMaxLimit="100">
      		<!-- auto sharding by id (long) -->
      		<!-- 
      			配置虚拟的逻辑表
      			name:虚拟逻辑表的名字
      			dataNode:真实的数据保存的分片
      			rule:切分算法
      		 -->
      		<table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
      
      
      	</schema>
      	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
      		/> -->
      	<!--
      		定义分片
      		name:定义分片名字
      		dataHost:分片配置信息
      		database:使用的真实的逻辑库
      	-->
      	<dataNode name="dn1" dataHost="localhost1" database="chen" />
      	<dataNode name="dn2" dataHost="localhost2" database="chen" />
      
      	<!-- dataHost 用户配置数据库链接信息 ,有几个分片就需要配置几个dataHost -->
      	<!--
      		name:连接信息的名字,可以自定义
      		maxCon minCon:连接池的信息,根须需要进行调整
      		balance:(重要)负载均衡的类型,0:不开启读写分离 | 1:保留一个写节点负责写入,其余写节点需要处理读取请求
      									2:所有的写节点都需要额外承担读请求 | 3:写节点就负责写请求,读节点就是处理读请求
      		writeType:0:所有的写操作分发给第一个写节点,该节点宕机才回启用第二个写节点
      				   1:所有的写操作由所有的写节点承担
      		dbType="mysql" dbDriver="native":数据库连接驱动
      		switchType:(重要)依据什么条件来切换节点
      					1:Mycat使用自己的心跳检测来判断哪个节点宕机,应该切换到哪个节点
      					2:根据数据库集群的信息来切花节点
      	-->
      	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="1" dbType="mysql" dbDriver="native"
      	 switchType="1" slaveThreshold="100">
      		<!-- 心跳检测的SQL语句 -->
      		<heartbeat>select user()</heartbeat>
      		<!-- can have multi write hosts -->
      		<!--
      			writeHost:配置写节点
      			host:名字自定义
      			url:节点的连接ip
      			user:节点的连接用户名
      			password:节点连接的用户密码
      		-->
      		<writeHost host="W1" url="192.168.56.11:3306" user="root" password="Admin123456">
      			<!-- can have multi read hosts -->
      			<!-- 读节点的配置 -->
      			<readHost host="W1R1" url="192.168.56.22:3306" user="root" password="Admin123456" />
      			<readHost host="W2R2" url="192.168.56.33:3306" user="root" password="Admin123456" />
      		</writeHost>
      		<!-- 写节点的冗余备份 -->
      		<writeHost host="W2" url="192.168.56.22:3306" user="root" password="Admin123456">
      			<!-- can have multi read hosts -->
      			<!-- 读节点的配置 -->
      			<readHost host="W1R1" url="192.168.56.11:3306" user="root" password="Admin123456" />
      			<readHost host="W2R2" url="192.168.56.33:3306" user="root" password="Admin123456" />
      		</writeHost>
      	</dataHost>
      	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="1" dbType="mysql" dbDriver="native"
      	 switchType="1" slaveThreshold="100">
      		<!-- 心跳检测的SQL语句 -->
      		<heartbeat>select user()</heartbeat>
      		<!-- can have multi write hosts -->
      		<!--
      			writeHost:配置写节点
      			host:名字自定义
      			url:节点的连接ip
      			user:节点的连接用户名
      			password:节点连接的用户密码
      		-->
      		<writeHost host="W1" url="192.168.56.44:3306" user="root" password="Admin123456">
      			<!-- can have multi read hosts -->
      			<!-- 读节点的配置 -->
      			<readHost host="W1R1" url="192.168.56.55:3306" user="root" password="Admin123456" />
      			<readHost host="W2R2" url="192.168.56.66:3306" user="root" password="Admin123456" />
      		</writeHost>
      		<!-- 写节点的冗余备份 -->
      		<writeHost host="W2" url="192.168.56.55:3306" user="root" password="Admin123456">
      			<!-- can have multi read hosts -->
      			<!-- 读节点的配置 -->
      			<readHost host="W1R1" url="192.168.56.44:3306" user="root" password="Admin123456" />
      			<readHost host="W2R2" url="192.168.56.66:3306" user="root" password="Admin123456" />
      		</writeHost>
      	</dataHost>
      
      </mycat:schema>
      
    • rule.xml
      修改较少,在文件中修改分片数量
      <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
      	<!-- how many data nodes -->
      	<!-- 修改此处的分片数量 -->
      	<property name="count">2</property>
      </function>
      
  • 开放防火墙,关闭SELINUX

    端口作用
    8066数据服务
    9066管理端口

使用Mycat

  • 启动和关闭Mycat
    • 修改启动命令的权限(bin目录)
      chmod -R 777 ./*.sh
      
    • 启动
      ./startup_nowrap.sh
      
    • 关闭(关闭进程,查找进程->杀死进程)
      ps -aux | grep mycat
      kill -9 1012
      

数据切分

切分算法

切分算法适用场合备注
主键求模算法数据增长速度慢,难于增加分片有明确的主键值
枚举切分归类存储数据,适合与大多数的业务需求
主键范围切分数据快速增长,容易增加分片有明确的主键
日期切分数据快速增长,容易增加分片
  • 主键求模切分
    求模切合适合用在初始的数据量大,但是数据增长不是很快的场景

    • 地图产品
    • 行政数据
    • 企业数据

    求模切分的短板在于拓展新分片的时候难度大,需要迁移的数据量大,在现有分片不足以保存热数据的时候才考虑拓展分片,建议拓展后的分片数量是原有数量的2N倍,如原有的2个分片拓展成4个分片(对原有数据主键对4取余):
    2分片拓展成4分片

  • 枚举值切分
    按照某个字段的值(数字)来切分数据
    优点:数据可用性好,比如一个分片宕机,只会影响该分片所管理的数据操作,不会影响其他分片的数据操作
    缺点:数据存储不均匀,有的分片数据量特别大,有的分片数据量特别小

    • 实际操作
      /mycat/conf/目录下创建customer-hash-int.txt文件

      101=0
      102=0
      103=0
      104=1
      105=1
      106=1
      

      rule.xml文件中添加一个function标签

      <!-- 自定义枚举切分数据 -->
      <function name="customer-hash-int"
      		class="io.mycat.route.function.PartitionByFileMap">
      	<property name="mapFile">customer-hash-int.txt</property>
      </function>
      

      配置数据表的切分字段<tableRule>标签

      <!-- 自定义的枚举值切分配置 -->
      <tableRule name="sharding-by-customerIntfile">
      	<rule>
      		<columns>sharding_id</columns>
      		<algorithm>customer-hash-int</algorithm>
      	</rule>
      </tableRule>
      

      schema.xml文件中配置应用该切分算法的数据表t_customer

      <schema name="chen" checkSQLschema="false" sqlMaxLimit="100">
      	<!-- auto sharding by id (long) -->
      	<!-- 
      		配置虚拟的逻辑表
      		name:虚拟逻辑表的名字
      		dataNode:真实的数据保存的分片
      		rule:切分算法
      	 -->
      	<table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
      	<!-- 增加的枚举值切分配置 -->
      	<table name="t_customer" dataNode="dn1,dn2" rule="sharding-by-customerIntfile">
      </schema>
      

      连接Mycat管理端口9066,执行SQL语句(建议才命令行执行DataGrip客户端不支持执行此SQL语句,使用Navicat客户端也可以)

      mysql -uroot -h127.0.0.1 -P9066 -p
      
      -- 热加载配置
      reload @@config_all;
      

      Mycat执行热加载配置的界面
      创建t_customer数据表,创建数据表的操作不允许在mycat上执行,需要在两个数据分片中分别执行建表操作。

      use chen;
      
      create table `t_customer`
      (
        `id`        int primary key,
        `username`  varchar(200) not null,
        sharding_id int          not null
      );
      

      在Mycat上执行插入语句:

      insert into `t_customer`(id, username, sharding_id)
      values (1, '小明1', 101);
      insert into `t_customer`(id, username, sharding_id)
      values (2, '小明2', 102);
      insert into `t_customer`(id, username, sharding_id)
      values (3, '小明3', 104);
      

      分别在两个分片上查询可以得到如下结果:
      在这里插入图片描述
      在这里插入图片描述
      Mycat查询结果:Mycat查询结果

父子表

情况:小明的用户信息被切分算法保存到了分片1,但是小明的购物记录等信息被保存到了分片2,同样的,小芳的用户信息被保存到分片2,但是小芳的购物信息记录被保存到了分片1。但是如果在系统中小芳需要查询自己的所有购物信息,一定是需要跨越分片进行数据操作,在这种情况下,表连接的IO传输成本过大,因此在Mycat中不允许扩分片做表连接的查询。

为了解决上述问题,Mycat提出了父子表的解决方案。父表可以使用任何的数据切分算法,但是子表不允许有切分算法,子表的数据需要跟随父表。
即父表的数据被保存到哪个分片,则子表的数据也一定需要被保存到该数据分片。

  • schema.xml中配置父子表的关系

    <!-- 配置数据表 ,定义虚拟逻辑库和虚拟逻辑表 -->
    <!-- 
    	name:虚拟逻辑库的名字
    	-->
    <schema name="chen" checkSQLschema="false" sqlMaxLimit="100">
    	<!-- auto sharding by id (long) -->
    	<!-- 
    		配置虚拟的逻辑表
    		name:虚拟逻辑表的名字
    		dataNode:真实的数据保存的分片
    		rule:切分算法
    	 -->
    	<table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
    	<!-- 增加的枚举值切分配置 -->
    	<table name="t_customer" dataNode="dn1,dn2" rule="sharding-by-customerIntfile">
    		<!-- 增加的子表配置 -->
    		<childTable name="t_orders" primaryKey="ID" joinKey="customer_id" parentKey="id" >
    		</childTable>
    	</table>
    </schema>
    

    修改完成配置记得登录Mycat管理端口,重新加载配置

  • 在两个分片中创建子表t_orders

    -- 创建子表`t_orders`
    drop table if EXISTS `t_order`;
    create table `t_orders`
    (
      `id`          int primary key,
      `customer_id` int not null,
      `datetime`    timestamp default current_timestamp
    );
    
  • Mycat中插入数据

    insert into `t_orders` (`id` , `customer_id`)values (1,1);
    insert into `t_orders` (`id` , `customer_id`)values (2,1);
    insert into `t_orders` (`id` , `customer_id`)values (3,2);
    insert into `t_orders` (`id` , `customer_id`)values (4,3);
    
  • 在两个分片中分别查看用户订单表:
    两个分片数据查询结果
    用户订单表的数据成功保存在当前用户所在的分片中。

  • 用户订单数据连接查询(Mycat中执行)

    -- 查询所有用户的订单情况
    select customer.id, customer.username, orders.id order_id, orders.datetime
    from t_customer customer
           join t_orders orders on customer.id = orders.customer_id;
    

    查询结果:订单情况查询

组建双机热备的Mycat集群

准备工作

  • 准备两个Mycat
    之前的操作,我是把我的Mycat放到了我的本地计算机中,到了这一步,我准备把Mycat上传到我创建的两台虚拟机上,一台的ip为192.168.56.11,另一台IP为192.168.56.44
    上传命令为:
    # 先进入到本地,注意:是本地Mycat所在的文件夹,因为本地的MyCat是配置好的
    scp -r ./mycat/ root@192.168.56.11:/root/
    # 上传到另一台虚拟机上
    scp -r ./mycat/ root@192.168.56.44:/root/
    
  • 准备两个Haproxy
    同样的,为了节省内存,我将两个Haproxy分别部署到了上面的两台虚拟机上

安装Haproxy

  • 安装Haproxy准备工作

    • 关闭防火墙端口
    端口作用
    8888TCP/IP转发端口
    4001监控界面端口
    firewall-cmd --zone=public --add-port=8888/tcp --permanent
    firewall-cmd --zone=public --add-port=4001/tcp --permanent
    firewall-cmd --reload
    
    • 关闭SELINUX

      vi /etc/selinux/config
      

      把SELINUX属性值设置成disabled

      reboot
      
  • 安装Haproxy与使用

    安装Haproxy

    # 安装Haproxy
    yum install -y haproxy
    

    修改Haproxy配置文件

    # 修改Haproxy配置文件
    vim /etc/haproxy/haproxy.cfg
    

    配置文件内容如下:haproxy.cfg

    #---------------------------------------------------------------------
    # Example configuration for a possible web application.  See the
    # full configuration options online.
    #
    #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
    #
    #---------------------------------------------------------------------
    
    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    global
        # to have these messages end up in /var/log/haproxy.log you will
        # need to:
        #
        # 1) configure syslog to accept network log events.  This is done
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
        #    /etc/sysconfig/syslog
        #
        # 2) configure local2 events to go to the /var/log/haproxy.log
        #   file. A line like the following can be added to
        #   /etc/sysconfig/syslog
        #
        #    local2.*                       /var/log/haproxy.log
        #
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    # use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode                    http
        log                     global
        # 日志格式
        option                  httplog
        # 日志中不记录负载均衡的心跳检测记录
        option                  dontlognull
        # 连接超时(毫秒)
        timeout connect         5000
        # 客户端超时(毫秒)
        timeout client          50000
        # 服务器超时
        timeout server          50000
    
    # 监控界面
    listen admin_stats
        # 监控界面的访问IP和端口
        bind        0.0.0.0:4001
        # 访问协议
        mode        http
        # URI相对地址
        stats uri   /dbs
        # 统计报告格式
        stats realm     Global\ statistics
        # 登录账户信息
        stats auth      admin:abc123456
    
    # 数据库负载均衡
    listen proxy-mysql
        # 访问的IP和端口
        bind        0.0.0.0:8888
        # 网络协议
        mode        tcp
        # 负载均衡算法(轮询算法)
        # 轮询算法:roundrobin
        # 权重算法:static-rr
        # 最少连接算法:leastconn
        # 请求源IP算法:source
        balance     roundrobin
        # 日志格式
        option      tcplog
        # 负载均衡
        server  mycat_1 192.168.56.11:8066 check port 8066 weight 1 maxconn 2000
        server  mycat_2 192.168.56.44:8066 check port 8066 weight 1 maxconn 2000
        # 使用keeplive监测死链
        option  tcpka
    

    启动Haproxy

    service haproxy start
    

    停止Haproxy

    service haproxy stop
    

    重启Haproxy

    service haproxy restart
    
  • 启动效果:(需要登录)
    启动效果

  • 数据操作

    • 连接
      连接Haproxy,端口为8888,但是连接的用户名和密码为你配置的Mycat的,因为你说有的请求都是通过Haproxy转发给Mycat的

      mysql -uroot -h192.168.56.11 -P8888 -p
      

      连接Haproxy

    • 查询

      -- 切换到chen数据库
      use chen;
      -- 查看所有数据表
      show tables;
      -- 查询t_customer表中所有数据
      select * from t_customer order by id;
      

      查询结果

    • 添加

      -- 添加两条数据到t_customer
      insert into t_customer (`id`,`username`,`sharding_id`)
      values(5,'凡尘',104);
      insert into t_customer (`id`,`username`,`sharding_id`)
      values(6,'烟雨',101);
      -- 查询添加后的结果
      select * from t_customer order by id;
      

      添加记录后的查询结果

  • 关闭一个Mycat节点检验是否能正常工作

    在IP为192.168.56.44的虚拟机上关闭Mycat

    # 查询Mycat的进程id
    ps -aux | grep mycat
    # 杀死Mycat进程
    kill -9 2024
    

    在之前的连接中发现可以正常对数据进行操作。但是监控界面上的Mycat2已经宕机。
    杀死一个t 的实验

使用Keepalived抢占虚拟IP

  • 开启防火墙的VRRP协议
    #开启VRRP
    firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol  vrrp -j ACCEPT
    #应用设置
    firewall-cmd --reload
    
  • 安装Keepalived
    • 安装

      	yum install -y keepalived
      
    • 配置

      vim /etc/keepalived/keepalived.conf
      

      配置文件如下:keepalived.conf

      ! Configuration File for keepalived
      
      vrrp_instance VI_1 {
          state MASTER
          interface eth0
          virtual_router_id 52
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.56.99
          }
      }
      
    • 常用命令

      # 启动
      service keepalived start
      # 停止
      service keepalived stop
      # 重启
      service keepalived restart
      
    • 使用配置的虚拟IP访问进行数据操作。

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

凡尘code

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值