从零搭建MySQL数据库集群(一):主从复制、PXC集群

本篇使用docker搭建集群 如果没有安装docker 请参考我的博客 https://blog.csdn.net/weixin_43934607/article/details/100141057

搭建集群使用的数据库是mysql的优化版percona 对mysql做了一些优化

集群的讲解分为三篇

  • (一):主从复制集群、PXC集群 https://blog.csdn.net/weixin_43934607/article/details/102762570
  • (二):MyCat中间件、Haproxy负载均衡 https://blog.csdn.net/weixin_43934607/article/details/102769179
  • (三):前面四种技术的综合应用 https://blog.csdn.net/weixin_43934607/article/details/102784120

Replication集群架构(主从复制)

  • mysql主(称master)从(称slave)复制的原理:

    • master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)
    • slave将master的binary log events拷贝到它的中继日志(relay log)
    • slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)
  • 主从配置需要注意的地方

    • 主DB server和从DB server数据库的版本一致
    • 主DB server和从DB server数据库数据一致
    • 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一
主机 端口 容器名称 表角色
192.168.56.129 3306 percona-master01 master
192.168.56.129 3307 percona-slave01 slave

搭建主库

  • 创建目录
    mkdir -p /data/mysql/master01
    cd /data/mysql/master01
    mkdir conf data
    chmod 777 * -R
    
  • 创建配置文件
    cd /data/mysql/master01/conf
    vi my.cnf
    
  • 输入如下内容
    [mysqld]
    log-bin=mysql-bin 	#开启二进制日志
    server-id=1			#服务id,一个集群中不可重复
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
    #设置需要同步的数据库
    binlog‐do‐db=user_db
    #屏蔽系统库同步
    binlog‐ignore‐db=mysql
    binlog‐ignore‐db=information_schema
    binlog‐ignore‐db=performance_schema
    
  • 创建容器(会自动拉取percona:5.7.23 的镜像)
    docker create 	--name percona-master01 \
    -v /data/mysql/master01/data:/var/lib/mysql \
    -v /data/mysql/master01/conf:/etc/my.cnf.d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    percona:5.7.23
    
  • 启动
    docker start percona-master01 && docker logs -f percona-master01
    
  • 用navicat连接该数据库
    • 端口:3306、用户名root、密码:root
  • 执行查询语句:创建同步账户以及授权
    • 主数据库创建了一个用户,用户名:test、密码:test
    create user 'test'@'%' identified by 'test';
    grant replication slave on *.* to 'test'@'%';
    flush privileges;
    
  • 执行查询语句:查看
    • 查看master状态
    show master status;
    
    • 查看二进制日志相关的配置项
    show global variables like 'binlog%';
    
    • 查看server相关的配置项
    show global variables like 'server%';
    

搭建从库

  • 创建目录

    mkdir -p /data/mysql/slave01
    cd /data/mysql/slave01
    mkdir conf data
    chmod 777 * -R
    
  • 创建配置文件

    cd /data/mysql/slave01/conf
    vi my.cnf
    
  • 输入如下内容

    [mysqld]
    server-id=2
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
    #设置需要同步的数据库
    replicate_wild_do_table=user_db.%
    #屏蔽系统库同步
    replicate_wild_ignore_table=mysql.%
    replicate_wild_ignore_table=information_schema.%
    replicate_wild_ignore_table=performance_schema.%
    
  • 创建容器

    docker create --name percona-slave01 \
    -v /data/mysql/slave01/data:/var/lib/mysql \
    -v /data/mysql/slave01/conf:/etc/my.cnf.d \
    -p 3307:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    percona:5.7.23
    
  • 启动

    docker start percona-slave01 && docker logs -f percona-slave01
    
  • 用navicat连接该数据库

    • 端口:3307、用户名root、密码:root
  • 执行查询语句:设置master相关信息

    • 注意
      • 修改 master_host
      • 修改 master_log_file、master_log_pos(通过主数据库的“ show master status; ” 查看)
    CHANGE MASTER TO
    master_host='192.168.56.129',
    master_user='test',
    master_password='test',
    master_port=3306,
    master_log_file='mysql-bin.000003',
    master_log_pos=758;
    
  • 执行查询语句:启动同步

    start slave;
    
  • 执行查询语句:查看

    • 查看master状态
    show slave status;
    

    看到 Slave_IO_Running h和 Slave_SQL_Running 都是yes 说明搭建成功!在这里插入图片描述

    • 查看主从复制模式
    show global variables like 'binlog%';
    

    在这里插入图片描述

  • 如果集群失效 怎么重新设置

    • 从节点关闭集群
    stop slave
    
    • 主节点查看 log_file、log_pos
    show master status;
    
    • 从节点重新设置master相关信息并启动slave
  • 测试给从节点增加或删除数据主同时都发生了改变

PXC集群架构

  • Percona XtraDB Cluster提供了:
    • 同步复制,事务可以在所有节点上提交。
    • 多主机复制,你可以写到任何节点。
    • 从(slave)服务器上的并行应用事件,真正的“并行复制”。
    • 自动节点配置。
    • 数据一致性,不再有未同步的从服务器。

安装三节点的PXC

节点 端口 容器名称 数据卷
node1 13306 pxc_node1 v1
node2 13307 pxc_node2 v2
node3 13308 pxc_node3 v3
  • 创建数据卷

    • 存储路径:/var/lib/docker/volumes
    docker volume create v1_pxc
    docker volume create v2_pxc
    docker volume create v3_pxc
    
  • 拉取镜像并重命名

    • 注意:这里的版本必须是5.6,5.6之后的版本不再支持docker搭建集群
    docker pull percona/percona-xtradb-cluster:5.6
    docker tag percona/percona-xtradb-cluster:5.6 pxc
    
  • 创建网络

    docker network create --subnet=172.30.0.0/24  pxc-network
    
    #查看虚拟网络 docker network inspect 
    #删除虚拟网络 docker network rm 
    
  • 创建第一节点容器

    docker create -p 13306:3306 \
    -v v1_pxc:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e XTRABACKUP_PASSWORD=root \
    --privileged=true \
    --name=pxc_node1 \
    --net=pxc-network \
    --ip 172.30.0.2 \
    pxc
    
  • 创建第二节点容器

    • 增加了CLUSTER_JOIN参数
    docker create -p 13307:3306 \
    -v v2_pxc:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e CLUSTER_JOIN=pxc_node1 \
    -e XTRABACKUP_PASSWORD=root \
    --privileged=true \
    --name=pxc_node2 \
    --net=pxc-network \
    --ip 172.30.0.3 \
    pxc
    
  • 创建第三节点容器

    • 增加了CLUSTER_JOIN参数
    docker create -p 13308:3306 \
    -v v3_pxc:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -e CLUSTER_NAME=pxc \
    -e CLUSTER_JOIN=pxc_node1 \
    --privileged=true \
    --name=pxc_node3 \
    --net=pxc-network \
    --ip 172.30.0.4 \
    pxc
    
  • 先启动第一个节点

    • 第一节点启动成功并且初始化 另外两个节点才可以加入
    docker start pxc_node1 && docker logs -f pxc_node1
    
    • 用navicat连接成功之后再启动另外两个,端口:13306、用户名:root、密码:root
  • 启动第二、第三个节点

    docker start pxc_node2 pxc_node3
    
  • 用navicat 成功连接后两个节点

  • 测试给任一节点增加或删除数据其他两个节点同时都发生了改变

  • 如果启动失败 可以尝试一下下面的方法

    • 赋予文件权限
      sudo chmod -R 777  /var/lib/docker/volumes
      
    • 如果报错 hosts ‘192.168.56.1’ is not allowed to connect this mysql server
      • 进入mysql的容器
        docker exec -it pxc_node1 /bin/bash
        
      • 登陆mysql
        bash-4.2$ mysql -uroot -p
        
      • 开启mysql远程连接权限
        #执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接
        GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
        FLUSH PRIVILEGES;
        
      • 如果登陆mysql报错 Access denied for user ‘root’@‘localhost’ (using password: YES)
        • 修改mysql容器的 my.conf
        bash-4.2$ vi etc/my.cnf
        
        • 增加:skip-grant-tables
          从零搭建MySQL数据库集群(一):主从复制、PXC集群_第1张图片
        • 退出容器 重启mysql容器 并再次进入
        bash-4.2$ exit
        [root@localhost ~]# docker stop pxc_node1
        [root@localhost ~]# docker start pxc_node1
        [root@localhost ~]# docker exec -it pxc_node1 bash
        
        • 重新登陆mysql 输入密码时直接按回车跳过 即可登陆成功
        bash-4.2$ mysql -uroot -p
        

PXC集群方案与Replication区别

  • PXC集群方案所有节点都是可读可写的,Replication从节点不能写入,因为主从同步是单向的,无法从slave节点向master点同步。
  • PXC同步机制是同步进行的,这也是它能保证数据强一致性的根本原因,Replication同步机制是异步进行的,它如果从节点停止同步,依然可以向主节点插入数据,正确返回,造成数据主从数据的不一致性。
  • PXC是用牺牲性能保证数据的一致性,Replication在性能上是高于PXC的。所以两者用途也不一致。PXC是用于重要信息的存储,例如:订单、用户信息等。Replication用于一般信息的存储,能够容忍数据丢失,例如:购物车,用户行为日志等。

你可能感兴趣的:(SQL,NOSQL)