zoukankan      html  css  js  c++  java
  • 搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群,测试有效

    搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群

     运行环境:

    1虚拟机系统版本 

    Ubuntu16.04版本(系统登录:root(ubuntu1))

    数据库版本 

    mysql5.7(用户名root 密码root)

    安装环境:

    首先,不论是在云服务器、物理机还是虚拟机上,至少需要3台主机(我们将这三台主机称为“Nodes”),对于每一个”Node”,硬件最低配置要求为: 

    - 1GHz单核CPU 
    - 512M的内存 
    - 100Mbps的网络连接 
    - 三台主机IP为: 
    - Node1: 192.168.1.210(主节点)
    - Node2: 192.168.1.218(从节点1)
    - Node3: 192.168.1.220(从节点2)

    (1)禁用SELinux的mysqld

    所有节点执行

    如果你启用了SELinux,它可能会阻止 mysqld从执行所需的操作。你必须禁用SELinux mysqld禁用SELinux mysql运行以下命令

    apt install policycoreutils  -y  &&  semanage permissive -a  mysqld_t

    2防火墙配置:

    直接关闭所有节点的防火墙

    3禁用Ubuntu的apparmor:

    所有节点执行

    apparmor主要是Ubuntu系统中对mysql访问权限的控制,我们必须禁用AppArmor,以便配置mysql的mysqld能够运行外部程序。禁用apparmor:

    sudo ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld  

    apt install apparmor-utils  -y

    sudo aa-complain  /etc/apparmor.d/usr.sbin.mysqld

    service apparmor restart


    注:如果不禁用,则在登录mysql时会出现如下错误:

    apparmor="DENIED" operation="open" ........

    对应解决方案:

    直接修改apparmor配置文件

    nano /etc/apparmor.d/usr.sbin.mysqld

    在配置文件中的以下行增加”flags=(complain)”,如下:

    /usr/sbin/mysqld flags=(complain) {

      #include <abstractions/base>

       #include <abstractions/nameservice>

       #include <abstractions/user-tmp>

       #include <abstractions/mysql>

        ........

        ........

    }

    开始安装

    (0)安装mysql5.7

    所有节点执行

    安装mysql5.7的步骤如下:

    顺序执行:

    sudo apt update 首先更新一下软件列表

    sudo apt install mysql-client-core-5.7 -y 物理端的核心

    sudo apt install mysql-client-5.7 -y    客户端的组件

    sudo apt install mysql-server-5.7 -y  服务端,安装的过程会提示输入root用户的数据库密码

    sudo apt install mysql-workbench -y    这是MySQL自己的可视化工具,至此已安装完毕,打开工具可直接登录

    安装完成后查看状态: service mysql status

    登录:mysql -u root -h localhost -p  #输入密码

    查看版本:mysql> select version();

    1)安装对应依赖

    所有节点执行

    apt-get install python-software-properties  -y  &&  apt-get install software-properties-common -y

    (2)添加GunPG key

    所有节点执行

    apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

    (3)配置Ubuntu下galera源

    所有节点执行

    创建galera.list文件:

    touch  /etc/apt/sources.list.d/galera.list

    nano   /etc/apt/sources.list.d/galera.list

    galera.list中添加内容:

    #Codership Repository (Galera Cluster for MySQL)

    deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu xenial main

    deb http://releases.galeracluster.com/galera-3/ubuntu xenial main

     

    链接中的“xenial”为你所用的ubuntu系统的版本号,如果不清楚自己的Ubuntu版本号,可通过命令lsb_release -a来查看。

     

    (4)继续配置源

    所有节点执行

    touch /etc/apt/preferences.d/galera.pref

    nano  /etc/apt/preferences.d/galera.pref

    galera.pref文件中添加内容:

    Package: *

    Pin: origin releases.galeracluster.com

    Pin-Priority: 1001

    (5)更新源

    所有节点执行

    sudo apt-get update

    6)安装mysql和Galera

    一旦在所有服务器上更新了存储库,就可以在三台服务器上运行以下命令安装MySQL5.7的修补程序与Galera

    sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7  -y

    报错:

     

    解决:这是Ubuntu自身apt安装软件时的软件依赖问题。

    按照错误提示执行: sudo apt-get -f install -y

    又报错:

     

    接着执行:

    sudo dpkg -i --force-overwrite  /var/cache/apt/archives/mysql-wsrep-common-5.7_5.7.29-25.21-1ubuntu16.04_amd64.deb

    sudo apt-get -f install -y

     

    sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7  -y

     

    sudo apt autoremove  -y

    此时再执行”sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7  -y”时就不会报错了。

     

    7安装完成之后,在每一个节点上启动Mysql:

    所有节点执行

    service mysql start

    报错:

     

    决:

    原因可能是之前使用apt-get 安装过mysql,服务被标记过,解除后即可启动:

    systemctl unmask mysql.service

    8验证节点之间是否能互相ping通:

    主节点135上:

    Ping 192.168.93.132

    Ping 192.168.93.134

    从节点132上:

    Ping 192.168.93.135

    Ping 192.168.93.134

    从节点134上:

    Ping 192.168.93.135

    Ping 192.168.93.132

    ping同则表示三节点之间能互相通信。

    (9)分别在三个节点上修改mysql的配置文件/etc/mysql/my.cnf

    主节点210上:

    !includedir /etc/mysql/conf.d/

    !includedir /etc/mysql/mysql.conf.d/

    [mysqld]

    binlog_format=ROW

    default-storage-engine=innodb

    innodb_autoinc_lock_mode=2

    wsrep_provider=/usr/lib/libgalera_smm.so

    wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"

    wsrep_cluster_name="galeracluster2"

    wsrep_cluster_address="gcomm://"

    wsrep_sst_method=rsync

    wsrep_sst_auth=root:root

    wsrep_node_address="192.168.1.210"

    wsrep_node_name=node210

    lower_case_table_names=1

    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

     

    其中:

    wsrep_sst_auth  数据库的root用户的用户名密码

     

     

    从节点218上:

    !includedir /etc/mysql/conf.d/

    !includedir /etc/mysql/mysql.conf.d/

    [mysqld]

    binlog_format=ROW

    default-storage-engine=innodb

    innodb_autoinc_lock_mode=2

    wsrep_provider=/usr/lib/libgalera_smm.so

    wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"

    wsrep_cluster_name="galeracluster2"

    wsrep_cluster_address="gcomm://192.168.1.210"

    wsrep_sst_method=rsync

    wsrep_sst_auth=root:root

    wsrep_node_address="192.168.1.218"

    wsrep_node_name="node218"

    lower_case_table_names=1

    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

     

    从节点220上:

     

    !includedir /etc/mysql/conf.d/

    !includedir /etc/mysql/mysql.conf.d/

    [mysqld]

    binlog_format=ROW

    default-storage-engine=innodb

    innodb_autoinc_lock_mode=2

    wsrep_provider=/usr/lib/libgalera_smm.so

    wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"  

    wsrep_cluster_name="galeracluster2"

    wsrep_cluster_address="gcomm://192.168.1.218"

    wsrep_sst_method=rsync

    wsrep_sst_auth=root:root

    wsrep_node_address="192.168.1.220"

    wsrep_node_name=node220

    lower_case_table_names=1

    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

     

    10)在每个节点上重启mysql:

    先重启主节点210,再重启218和220

    service mysql restart

    11)验证mysql彼此监听是否成功

    先将每个节点上的数据库的root用户远程登录权限打开,此处就不展开了。然后在任意一个节点上登录其余两个节点的数据库,如果都能彼此登录,则表明三台服务器上的mysql彼此监听成功。

    如在210上登录218220

    mysql -h 192.168.1.218 -u root -p

    mysql -h 192.168.1.220 -u root -p

     

    如果彼此登录不成功,则需要在每个节点上创建用户以实现mysql的远程登录。创建用户时,需要对应每个节点的mysql的配置文件/etc/mysql/my.cnf中设置“wsrep_sst_auth=wsrep:199077”项,该项用来设置服务器之间mysql彼此访问的用户名和密码,其中wsrep为用户名,199077为密码。

    具体创建命令如下:

    每个节点上执行:

    mysql -u root -h localhost -p

    mysql> create user 'wsrep'@'%' identified by '199077';

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'wsrep'@'%' IDENTIFIED BY '199077' WITH GRANT OPTION;

    mysql> FLUSH PRIVILEGES;

     

    然后重启各个节点的mysql

    先重启主节点210,再重启218和220

    service mysql restart

     

    启动集群

    1)主节点上将mysql服务先停掉然后重启,注意一定要在前面提到的wsrep_cluster_address="gcomm://"的节点上(即主节点)执行最开始的启动程序,我这里是节点210上执行

    service mysql stop 

    service mysql start --wsrep-new-cluster

     

    此时可能报错,执行“ journalctl -xe”查看报错如下:

    Mar 13 23:36:22 ubuntu210 kernel: [254092.727648] audit: type=1400 audit(1584167782.519:569): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/mysqld" pid=68122 comm="apparmor_parser"

    解决:

    在每个节点上执行:

    第一步:sudo apt-get remove apparmor

    第二步:打开文件/usr/share/mysql/mysql-systemd-start,将该文件的以下行注释掉。

     

    第三步:重启虚拟机 sudo  reboot

    第四步:执行service  mysql  start

    2)在其他节点上执行:service mysql restart

    验证是否成功

    查看数据表

    登录主节点210

    mysql -u root  -h localhost -p 

    Enter password:

    mysql> SHOW STATUS LIKE 'wsrep%';

    重点关注的是下面这几行:

    wsrep_ready     |     ON

    如果状态是 ON,那么就要看:

    wsrep_cluster_size    |   3

    如果是3,那么是成功的,否则是不成功的!

     复制测试

    主节点210上创建一个数据库

    mysql> CREATE database test;

    mysql> show databases;

     

    然后到节点218220上使用show databases; 查看是否也有test这个数据库,如果有则成功!

     

    集群的状态监控相关参数

    (1)wsrep_cluster_state_uuid显示了cluster的state UUID,由此可看出节点是否还是集群的一员

    SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';

    (2)wsrep_cluster_conf_id显示了整个集群的变化次数。所有节点都应相同,否则说明某个节点与集群断开了

    (3)wsrep_cluster_status显示集群里节点的主状态。标准返回primary。如返回non-Primary或其他值说明是多个节点改变导致的节点丢失或者脑裂。如果所有节点都返回不是Primary,则要重设quorum。具体参见http://galeracluster.com/documentation-webpages/quorumreset.html如果返回都正常,说明复制机制在每个节点都能正常工作

    show global status like 'wsrep_cluster_status';
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | wsrep_cluster_status | Primary |
    +----------------------+---------+

    重启集群

    偶尔,您可能不得不重新启动整个Galera集群。例如,在停电的情况下,每个节点都被关闭,并且根本没有mysqld进程,这可能会发生。 

    要重新启动整个Galera集群,步骤:

    (1)把所有节点数据库服务关闭,在所有节点上执行:service mysql stop

    (2)选择节点,执行:

    sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/mysql/grastate.dat

    service mysql start --wsrep-new-cluster

    (3)把所有节点数据库服务开启,在所有从节点上执行:service mysql start

    4)检查集群状态,参考上面的步骤五验证重启是否成功。

  • 相关阅读:
    与大神聊天1h
    《海上钢琴师》观后感
    《小王子》读书笔记
    Joining Data with dplyr in R
    SQL学习笔记1
    电影《受益人》观后感
    markdown文本编辑学习笔记2
    importing-cleaning-data-in-r-case-studies
    一个测试人员的工作该怎么开展
    测试总结报告
  • 原文地址:https://www.cnblogs.com/dengyungao/p/12492940.html
Copyright © 2011-2022 走看看