zoukankan      html  css  js  c++  java
  • pxc /Galera Cluster详解

     

     

    解决主要得问题:

      无论是一主多从,还是多主架构,数据同步都是基于二进制日志完成,如果某子一节点挂了,都需要及时的,手动的去提升一个子节点为主节点。

    Galera Cluster介绍:

    它是一个集成了galera插件的mysql集群(采用了多主集群架构)。更是是一种新型的,数据不共享的,高度冗余的高可用方案(数据一致性,完整性,性能无法与单台单台机器相比)。目前galera cluster有两个版本。一个是Percona Xtradb Cluster以及Mariadb Cluster。

    Galera Cluster优缺点:

      优点:

        多主结构:数据在任何时候读写都是最新的(比如:数据的更新操作,当一个节点收到请求后都需要与其他节点进行校验,校验之后在更新本地数据,最后在同步)

        故障切换:在数据库出现故障时,因为支持多点写入,切换容易

        热插拔:在服务期间,如果数据库挂了,只需要停止该节点的数据库服务,不影整个集群(其他节点)。而且如果该节点修复后,只需启动数据库服务即可自动加入集群环境(原集群配置环境还存在)

        同步复制:在集群种的不同节点之间数据同步,没有延迟,而且单个节点数据库挂了之后,数据不会丢失

        并发复制:支持并行执行,提升性能

        自动节点克隆:在新增节点时,增量数据(即在基础数据上发送变化的数据)或基础数据无需手动备份提供,因为新增节点上mysql服务一旦开启,它将自动拉取在线节点数据。

      缺点:

        新节点加入需要全量拷贝数据,有时会导致数据同步的提供者无法提供读写,只有等待整个拷贝完成。

        只支持innodb存储引擎

        而且集群的性能取决于集群中性能最差的节点的性能(全局校验过程)

    Galera Cluster工作流程(不一定准确,自己的理解):

      

     Galera Cluster包括两个组件

    1. Galera replication library (galera-3)

    2.WSREP:MySQL extended with the Write Set Replication

    提示:PXC(Percona XtraDB Cluster)是Percona对Galera的实现。

         MariaDB Galera Cluster是mariadb对Galera的实现。

      两者都需要至少三个节点(至多8个节点),且不能安装mysql-server或mairadb-server

    RPM包

    PXC:

      https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch

    MariaDB Galera Cluster:

      https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-amd64/

    先介绍PXC(Percona XtraDB Cluster) 

    1.使用到的端口:(4个)

      3306:数据库对外服务的端口

      444:请求SST(State Snapshot Transfer,全量数据传送)的端口号

      4567:组成员之间进行沟通的端口号

      4568:用于传输IST(Incremental State Transfer,增量数据传送)的端口号

    2.节点状态的变化阶段

    OPEN:节点启动成功,尝试连接到集群时的状态
    PRIMARY:节点已处于集群中,在新节点加入并选取donor进行数据同步时的状态
    JOINER:节点处于等待接收同步文件时的状态
    JOINERD:节点完成数据同步工作,尝试保持和集群进度一致时的状态
    SYNCED:节点正常提供服务时的状态,表示已经同步完成并和集群进度保持一致
    DONOR(数据的提供者):节点处于为新加入的节点提供全量数据时的状态

    3.GCache模块:

      在PXC中一个特别重要的模块,它的核心功能就是为每个节点缓存当前最新的写集。

    如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST传输方式,这

    样可以让节点更快地加入集群中。建议优化的参数如下:

      gcache size:缓存写集增量信息的大小,它的默认大小是128MB,通过wsrep_provider_options

    参数设置,建议调整为2GB~4GB范围,足够的空间便于缓存更多的增量信息

      gcache.mem_size:GCache中内存缓存的大小,适度调大可以提高整个集群的性能 

      gcache.page_size:如果内存不够用(GCache不足),就直接将写集写入磁盘文件中

    演示percona XtraDB Cluster(pxc5.7)

      环境准备:

        以三台主机为例(centos7),各自的ip地址分别为:10.0.0.113,10.0.0.114,10.0.0.115

        如果主机安装了mysql或mariadb必须先卸载。

        关闭防火墙和selinux,时间要同步:

          关闭防火墙方法:

            查看状态:systemctl status firewalld

            临时关闭:systemctl stop firewalld

            永久关闭:systemctl disable  firewalld

          禁用selinux方法:

            查看状态:getenforce

            临时禁用:setenforce 0

            永久关闭:将/etc/sysconfig/selinux中SELINUX改为disabled,必须重启才能有效。

        为了演示方便区分主机(节点),这里将其主机名分别改为pxe1,pxe2,pxe3

            方法如下:

               临时修改:hostname pxe1

               永久关闭:hostnamectl set-hostname pxe1

      此处使用清华大学的yum源为例,安装pxc5.7。

         [root@pxe1 ~]# vi /etc/yum.repos.d/pxe.repo

            [percona]
            name=percona_repo
            baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
            enabled=1
            gpgcheck=0

      然后将其传送到10.0.0.114,10.0.0.115主机上,并且安装Percona-XtraDB-Cluster-57(这里可以用任何方式【如:scp命令,ansible工具等】)

         [root@pxe1 ~]#scp /etc/yum.repos.d/pxe.repo  10.0.0.114:/etc/yum.repos.d/pxe.repo

         [root@pxe1 ~]#scp /etc/yum.repos.d/pxe.repo  10.0.0.115:/etc/yum.repos.d/pxe.repo

         [root@pxc1 ~]#yum install Percona-XtraDB-Cluster-57 -y

         [root@pxc2 ~]#yum install Percona-XtraDB-Cluster-57 -y

         [root@pxc3 ~]#yum install Percona-XtraDB-Cluster-57 -y

         

         #此命令可以查看安装后生成的所有文件 

         [root@pxc1 ~]#rpm -ql rpm -ql Percona-XtraDB-Cluster-server-57

      在各个节点上分别配置mysql及集群配置文件:

        /etc/my.cnf:主配置文件

        也包括其他三个配置文件:mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 

        修改的文件:

          1. mysqld.cnf(可选),为例保证其server_id与各个节点不同,以及log_bin二进制日志功能

          2./etc/percona-xtradb-cluster.conf.d/wsrep.cnf。必需改       

            [root@pxe1 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
              [mysqld]
              wsrep_provider=/usr/lib64/galera3/libgalera_smm.so                 #指定Galera库的路径
              wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115          #Galera集群中各节点地址。gcomm:// [地址使用组通信协议]
              binlog_format=ROW                                #二进制日志的格式。目前只支持row格式
              default_storage_engine=InnoDB      #指定默认引擎,但目前只支持innoDB
              wsrep_slave_threads= 8
              wsrep_log_conflicts
              innodb_autoinc_lock_mode=2      #只能设置为2,设置为0或1时无法正确处理思索问题
              wsrep_cluster_name=pxc-cluster      #集群名称,可自定义,但各个节点需与之保持一致

              wsrep_node_address=10.0.0.113      #本节点在Galera集群中的通信地址,也是本机ip地址
              wsrep_node_name=pxc-cluster-node-1      #本节点在Galera集群中的通信名称,可自定义
              pxc_strict_mode=ENFORCING        #是否限制PXC启用正在试用阶段的功能,ENFORCING是默认值,表示不启用

              wsrep_sst_method=xtrabackup-v2      #state_snapshot_transfer(SST)使用的传输方法
              wsrep_sst_auth="sstuser:s3cretPass"      在SST传输时需要用到的认证凭据,格式为:"用户:密码",可自定义,但各个节点需与之保持一致.而且此账号还不存在,需要创建并授权

           

             [root@pxe2 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf        

                [mysqld]
                wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
                wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115
                binlog_format=ROW
                default_storage_engine=InnoDB
                wsrep_slave_threads= 8
                wsrep_log_conflicts
                innodb_autoinc_lock_mode=2
                wsrep_node_address=10.0.0.114
                wsrep_cluster_name=pxc-cluster
                wsrep_node_name=pxc-cluster-node-2
                pxc_strict_mode=ENFORCING
                wsrep_sst_method=xtrabackup-v2
                wsrep_sst_auth="sstuser:s3cretPass"

              [root@pxe3 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf        

                [mysqld]
                wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
                wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115
                binlog_format=ROW
                default_storage_engine=InnoDB
                wsrep_slave_threads= 8
                wsrep_log_conflicts
                innodb_autoinc_lock_mode=2
                wsrep_node_address=10.0.0.115
                wsrep_cluster_name=pxc-cluster
                wsrep_node_name=pxc-cluster-node-3
                pxc_strict_mode=ENFORCING
                wsrep_sst_method=xtrabackup-v2
                wsrep_sst_auth="sstuser:s3cretPass"

         启动第一个节点(在三个主机选任何一个主机都可以,这里选择10.0.0.113)。注意:第一个节点的启动方法与后面的节点启动方法不一样

            [root@pxc1 ~]#systemctl start mysql@bootstrap.service

            #查看端口是否开启3306,4567

            [root@pxc1 ~]#ss -tnl

           登录mysql数据库,创建/etc/percona-xtradb-cluster.conf.d/wsrep.cnf文件中的“sstuser:s3cretPass”账户和密码并授权。

            注意,第一次登录的账户默认为root@'localhost',密码随机的,需要查看/var/log/mysqld.log获取。

              [root@px1~]# grep '<password>' /var/log/mysqld.log           

              #登录mysql数据库

              [root@px1~]# mysql -uroot -p')+yf3W;qBe8Y'

              #修改密码

               mysql> ALTER USER root@'loclahost' IDENTIFIED BY '123456';

              #创建sstuser用户并授权

               mysql> CREATE USER ssuser@'locallhost'  IDENTIFIED BY 's3cretPass';

               mysql> GRANT RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON *.* TO  ssuser@'locallhost';

              #查看相关变量,重点关注wsrep_local_state,wsrep_cluster_size(集群中节点数量),wsrep_cluster_status等

                mysql> SHOW VAROABLES LIKE 'wsrep%'G;

                #查看单个变量的值

                  mysql>  SHOW VAROABLES LIKE '变量名';

        启动集群中的其他节点(10.0.0.114,10.0.0.115).而且启动之后数据会自动与10.0.0.113主机同步(故其他机器上登录数据库的账户都可以使用root@'loaclhost'  123456),启动方法如下:

           [root@pxc2 ~]#systemctl start mysql

           [root@pxc3 ~]#systemctl start mysql

           [root@pxc2 ~]#ss -tnl     #查看端口3306,4567端口

        验证集群状态,即验证搭建是否成功。

          在任何节点查看集群状态,如果wsrep_cluster_size变量显示为3,说明成功

          [root@pxc3 ~]#mysql -uroot -p123456

            mysql> SHOW VARIABLES LIKE 'wsrep_cluster_size';

      验证数据是否同步:

        1. 在任何主机上创建一个数据库,然后再其他主机上查询。

          mysql> CREATE DATABASE DB1;

          mysql> SHOW DATABASES;

        2.利用xshell软件,同时再三个节点数据库创建一个数据库,查看执行结果。(只有一个执行成功,其他提示数据库已存在)

           mysql> CREATE DATABASE DB2;

    至此基于pxc的集群环境已搭建成功并且已验证完成。其中有些命令是手打上去的;有些东西也是按自己理解写的;如果有错,欢迎评论,谢谢!

     后期如何将一个节点加到该集群中:比如pxc4 (ip:10.0.0.116),简单过程如下:

      1.拷贝/etc/yum.repos.d/pxc.repo到新主机上

      2.安装 Percona-XtraDB-Cluster-57 程序

      3.修改/etc/percona-xtradb-cluster.conf.d/wsrep.cnf中某些字段。如下

           [root@pxc3 ~]#vi  /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

                [mysqld]
                wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
                wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115,10.0.0.116    #修改此处
                binlog_format=ROW
                default_storage_engine=InnoDB
                wsrep_slave_threads= 8
                wsrep_log_conflicts
                innodb_autoinc_lock_mode=2
                wsrep_node_address=10.0.0.116             #修改此处
                wsrep_cluster_name=pxc-cluster
                wsrep_node_name=pxc-cluster-node-4      #修改此处   
                pxc_strict_mode=ENFORCING
                wsrep_sst_method=xtrabackup-v2
                wsrep_sst_auth="sstuser:s3cretPass"

      4.启动mysql服务

      5.查看及验证

    演示二:MariaDB Galera Cluster

      环境准备:

        以三台主机为例(centos8),各自的ip地址分别为:10.0.0.115,10.0.0.116,10.0.0.117

        如果主机安装了mysql或mariadb必须先卸载。

        关闭防火墙和selinux,时间要同步

        为了演示方便区分主机(节点),这里将其主机名分别改为mgc1,mgc2,mgc3

      详细过程:

        1.三台主机分别安装mariadb-server-galera.x86_64(AppStream里有,如果没有需要配置epel源)包。

          这里有个小技巧,利用xshell远程三台主机,然后再xshell菜单栏选择-->工具-->发送键输入到所有会话中。

          [root@mgc1 ~]# yum install mariadb-server-galera.x86_64 -y

        2.修改/etc/my.cnf.d/galera.cnf文件,将三台主机ip加到wsrep_cluster_address字段中。并且该协议为gcomm://(记住一定的改)

        3.将修改的文件分别传输到其他两台主机上,并且覆盖。

          [root@mgc1 ~]# scp /etc/my.cnf.d/galera.cnf 10.0.0.116:/etc/my.cnf.d/galera.cnf

          [root@mgc1 ~]# scp /etc/my.cnf.d/galera.cnf 10.0.0.117:/etc/my.cnf.d/galera.cnf

        4.启动第一个节点,并且连接数据库(账户默认为root,密码为空)查看变量wsrep_cluster_size的值。

           [root@mgc1 ~]#galera_new_cluster

           [root@mgc1 ~]#mysql

           MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';

        5.在启动其他主机的mariadb服务,在任何一台主机上查看wsrep_cluster_size的值

          [root@mgc2 ~]#systemctl  start mariadb

          [root@mgc3 ~]#systemctl  start mariadb

        6.验证(与pxc一样,1.新增一条数据,查看各节点之间数据是否同步。2.同时执行创建一个数据库操作,看各个节点之间执行结果 3. 停止某一个节点,查看wsrep_cluster_size是否有变动。4.新增一台主机加入到集群中,看数据是否自动同步...)

    提示:如果在centos7上搭建MariaDB Galera Cluster(5.5)集群环境,需要配置源。

     参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-amd64/

    后续操作与演示二一致,只是启动第一个节点时需要有区别:

      首次启动时,需要初始化集群,在其中一个节点上执行命令:/etc/init.d/mysql start --wsrep-new-cluster

    至此基于MariaDB Galera Cluster的集群环境已搭建成功并且已验证完成。其中有些命令是手打上去的;有些东西也是按自己理解写的;如果有错,欢迎评论,谢谢!

  • 相关阅读:
    《算法导论》读书笔记之第16章 贪心算法—活动选择问题
    C语言综合实验1—学生信息管理系统
    《算法导论》读书笔记之第15章 动态规划[总结]
    《算法导论》读书笔记之第11章 散列表
    模板类中定义list<T>::iterator iter在g++下不识别的解决办法
    C语言参考程序—无符号一位整数的四则运算
    《算法导论》读书笔记之第15章 动态规划—最优二叉查找树
    C语言综合实验2—长整数运算
    递归与尾递归总结
    《算法导论》读书笔记之第13章 红黑树
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15102205.html
Copyright © 2011-2022 走看看