day002 搭建 mysql 主从集群

搭建 mysql 主从集群
 
安装 mariadb
yum install mariadb mariadb-server
 
配置 my.cnf,添加参数
bind-address    = 0.0.0.0
symbolic-links  = 0
server-id       = 10
log_bin         = mysql-bin
binlog-format   = statement
relay-log       = relay-log
read_only       = 1
relay_log_purge = 0
innodb_file_per_table
 
修改 server-id 参数,后启动数据库
id=$(ip -o a s dev eth0|grep -Po "(?<=inet 192.168.4.)\d+")
sed "s,^\(server-id\t= \).*,\1${id}," -i /etc/my.cnf
 
启动服务
systemctl start mariadb
 
添加用户,开启主从同步
m01:
reset master;
create user 'repl'@'%' IDENTIFIED BY 'lper';
grant replication client,replication slave on *.* to repl@'%';
 
node{1..3}
reset slave;
change master to master_host='192.168.4.10',master_user='repl',master_password='lper';
start slave;
 
# 在 master 上配置 root 登录权限及密码
drop database test;
use mysql;
truncate db;
delete from user where User="";
delete from user where User="root" limit 2;
update user set Host="::1" where User="root" and Host="%";
update user set Host="127.0.0.1" where User="root" and Host="localhost";
update user set password=password('toor') where User="root";
flush privileges;
 
# 至此,mysql 主从已经创建完成
创建库、表及测试数据
 
读写分离
实现读写分离方式:
    1、程序代码兼容,对除 select 以外的操作在 master 上执行,select 在 slave 上执行
    2、中间件读写分离,对应用端透明
 
 
    mycat 读写分离和分布式架构中间件,Mycat 使用 java 开发,由于使用了JDK7的一些特性,所以必须 JDK7 或更高版本.
    安装依赖包
    yum install java-1.8.0-openjdk
 
    配置一个用户用来读,一个用户用来执行写操作
    create user 'read_user'@'%' IDENTIFIED BY 'user_read';
    grant select on *.* to 'read_user'@'%';
 
    找一台机器安装 mycat 中间件,不建议复用
    mycat 解压拷贝到 /usr/local/ 下
    修改配置文件 schema.xml
<?xml version="1.0"?>   
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">   
<mycat:schema xmlns:mycat="http://io.mycat/">   
   
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">           
    </schema>   
    <dataNode name="dn1" dataHost="localhost1" database="mydb" />   
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"   
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">   
        <heartbeat>select user()</heartbeat>   
        <!-- can have multi write hosts -->   
        <writeHost host="m01" url="192.168.4.10:3306" user="root" password="toor">   
            <!-- can have multi read hosts -->   
            <readHost host="node1" url="192.168.4.11:3306" user="read_user" password="user_read" />   
            <readHost host="node2" url="192.168.4.12:3306" user="read_user" password="user_read" />   
            <readHost host="node3" url="192.168.4.13:3306" user="read_user" password="user_read" />   
        </writeHost>   
    </dataHost>   
       
</mycat:schema>
 
    配置文件注意事项:
    conf/server.xml 可以不修改,但要注意  
    <property name="schemas">TESTDB</property>
    虚拟库名称,要和后面对应
    schemas是这个用户下的逻辑数据库可以有多个逻辑数据库可以用“,”逗号隔开
    用户名和密码是连接 mycat 的用户名和密码,与 mysql 实例的用户名密码无关
    mycat默认的普通连接端口是8066,管理连接端口是9066
    schema:逻辑数据库
    dataNode:节点
    dataHost:节点对应的读库写库的地址和连接
    balance指的负载均衡类型,目前的取值有4种:
    balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
    balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡
    balance="2",所有读操作都随机的在writeHost、readhost上分发。
    balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
 
    switchType指的是切换的模式,目前的取值也有4种:
    switchType='-1' 表示不自动切换
    switchType='1'  默认值,表示自动切换
    switchType='2'  基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
    switchType='3'  基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'
     
    WriteType参数设置:
    writeType=“0”, 所有写操作都发送到可用的writeHost上。
    writeType=“1”,所有写操作都随机的发送到readHost。
    writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
 
    配置完成以后连接 mycat 查询
    mysql -uroot -p123456 -h192.168.4.20 -P 8066 -e 'select @@hostname;'
    多查询几次,可以看到轮询效果
 
    读写分离了,mycat 单点故障, mysql master 单点故障怎么解决 ?
    官方推荐高可用方案
 
               +-------------+      +-----------+       +--------------------------+
               | keepalived  |      |  +-----+  |       | +--------+    +--------+ |    
               |------------ |      |  |mycat|  |  ==>  | |mysql(M)|<==>|mysql(M)| |       
               |  +-------+  |      |  +-----+  |       | +--------+    +--------+ |    
               |  |haproxy|=>| ==>  |           |       |  MHA或其他多主高可用方案 |
               |  +-------+  |      |  +-----+  |       |-~-~-~-~-~-~~~~-~-~-~-~-~-|           
client --> vip |    |高|     |      |  |mycat|  |  ==>  | +--------+    +--------+ |
               |    |可|     |      |  +-----+  |       | |mysql(S)| 从 |mysql(S)| |
               |    |用|     |      |           |       | +--------+ 库 +--------+ |  
               |  +-------+  |      |  +-----+  |       | +--------+ 集 +--------+ |     
               |  |haproxy|=>| ==>  |  |mycat|  |  ==>  | |mysql(S)| 群 |mysql(S)| |   
               |  +-------+  |      |  +-----+  |       | +--------+    +--------+ |   
               +-------------+      +-----------+       +--------------------------+
 
 
# 安装 haproxy 和 keepalived
yum install haproxy keepalived
 
haproxy 配置
listen mysql_3306 *:3308
    mode   tcp
    option tcpka
    balance     leastconn
    server mycat_01 192.168.4.15:8066 check inter 3000 rise 1 maxconn 1000 fall 3
    server mycat_02 192.168.4.20:8066 check inter 3000 rise 1 maxconn 1000 fall 3
 
keepalived 配置,vip 配置
global_defs {
    router_id mycat
}
 
vrrp_instance Mycat {
    state BACKUP
    interface eth0
    track_interface {
        eth0
    }
    virtual_router_id 150
    priority 200
    nopreempt
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass test_mycat
    }
    virtual_ipaddress {
        192.168.4.150/24   brd 192.168.4.255   dev eth0 label eth0:1
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40447206/article/details/81166557