Centos下搭建MariaDB集群

 最近公司测试库改建,之前测试库上面装的是老的MySql,我顺手就把它换成了MariaDB,后来因为连的人太多就爆了Too Many Connections,本来很简单的事情,就让技术部一小伙子上去把连接数调大了一点,很简单,但是后来我发现他居然直接写在了My.cnf下面,显然他是不知道MariaDB早就从My.cnf下面扩展到了my.cnf.d文件夹下面,于是就跟他一番讲解,然后就引出了配置集群的话题,所以觉得有必要写一下MariaDB的一些配置和集群的配置方法。

 MariaDB本身就是MySql的一个分支,所以很多东西都是MySql延展下来的,既然要说的话就先从安装说起吧,在CentOS下安装还是很简单的,官网有很明确的说明以及各种安装方法,我个人比较喜欢yum源的安装方法,下面我们开始。

第一步、安装MariaDB

 我们以最小集群来说,两台服务器先做主从配置,然后再做互为主从的配置,两台主机的IP分别为:192.168.70.135,192.168.70.137。

 先去官网上复制一下源的配置:

https://downloads.mariadb.org/mariadb/repositories/#mirror=neusoft&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.2

 选择对应的操作系统版本及MariaDB的版本后会给出对应的配置,我这里选择的是Centos7,MariaDB的版本是10.2,所以给出的源是这样的:

# MariaDB 10.2 CentOS repository list - created 2017-07-12 14:25 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

 OK!然后直接vim /etc/yum.repos.d/MariaDB.repo复制进去保存即可,然后yum安装

yum install MariaDB-server MariaDB-client

 不要以为安装完成就可以使用,mysql的用户和数据文件夹先指定一下,我的数据文件放在了/opt/data/mysql下面,执行下面的命令

mysql_install_db --defaults-file=/etc/my.cnf --datadir=/opt/data/mysql/ --user=mysql

 OK!这时启动一下看看

systemctl start mariadb
systemctl status mariadb

 不出意外,启动成功,设置一下root密码

mysqladmin -u root password "123456"

 登录一下,不出意外应该成功了。

第二步、配置MariaDB

 上面只是简单的安装,下面我们再简单的配置一下为集群做准备,先进入/etc/my.cnf.d/文件夹,MariaDB的所有配置文件都在这下面,主要配置文件还是在/etc/my.cnf.d/server.cnf下面

vim /etc/my.cnf.d/server.cnf

 修改[mysqld]下面的内容

[mysqld]
character-set-server=utf8
lower_case_table_names=1
init_connect='SET NAMES utf8'
datadir=/opt/data/mysql
socket=/opt/data/mysql/mysql.sock
server-id   = 1
log-bin=mysql-bin
log-bin-index=master-bin.index
relay-log=relay-log
relay-log-index=relay-bin
log-slave=updates

 1. character-set-server是设置数据库的编码格式
 2. lower_case_table_names是设置数据库不区分大小写
 3. datadir,socket是设置数据库实例的目录
 4. server-id这个很重要,是指定集群中数据库服务的ID,在集群情况下每台数据库服务的ID都不能重复
 5. log-bin和log-bin-index是开始MySQL的二进制日志并指定日志文件名
 6. relay-log和relay-log-index是开始MySQL的中继日志并指定日志文件名
 7. log-slave这个是设定slave节点的二进制输出,若没有设定此项则slave不会输出二进制,但是为了能够让slave也能够升级为master则该项最好配置一下

 为了能让两台MySQL服务能够互相连接,最好先创建让他们互相连接的数据库账户,现在master上简历用户,并授权,该账户为同步专用

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.70.137 IDENTIFIED BY '123456';

 PS:另外一台机器的/etc/my.cnf.d/server.cnf中其他配置都一样,就是server-id改成2,配置同步账户的时候IP地址改成可访问的机器的IP就行。

配置完成后两台机器都重启。

第三步、准备同步,配置主从

 全部配置并且两台机器都启动成功之后,就可以开始准备同步两台机器的数据了,在此之前先登录第一台机器的数据库,查看一下master的状态:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      922 |              |                  |
+------------------+----------+--------------+------------------+

 File就是当前该数据库binlog日志的文件索引所在的文件名,position是当前日志索引的位置,将这两个值记录下来,然后登录第二台数据库服务器,启动slave:

mysql> CHANGE MASTER TO 
        MASTER_HOST='192.168.70.135',
        MASTER_USER='repl',
        MASTER_PASSWORD='123456',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=922;

 执行完成之后如果没有报错再执行show slave status\G命令查看slave节点的同步状态,如果ERROR没有显示错误并且Slave_IO_Running都为yes则表示同步成功。

    MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.70.135
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 922
               Relay_Log_File: relay-bin.000003
                Relay_Log_Pos: 555
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 922
              Relay_Log_Space: 858
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)

 这时在master节点的数据库服务器中创建数据库、创建表的话slave节点就直接可以看到了

 PS:同步之前最好先检查一下你服务器的防火墙有没有拦截3306端口!

第四步、双主配置

 前面的所有步骤完成后已经可以搭建单主多slave的架构了,如果想配置互为主从的其实很简单,在master节点中重复第三步,把master的IP指向对应的节点就好,不过需要注意的是Master可以有多个Slave,但是一个Slave只能挂靠一个Master!好的,我们先去192.168.70.137这台节点上查看一下master的status(就是第三步中的slave节点)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      985 |              |                  |
+------------------+----------+--------------+------------------+

 然后再刚才master节点的数据库中执行:

mysql> CHANGE MASTER TO 
        MASTER_HOST='192.168.70.137',
        MASTER_USER='repl',
        MASTER_PASSWORD='123456',
        MASTER_LOG_FILE='mysql-bin.000002',
        MASTER_LOG_POS=985;

 如果没有报错,那么双主执行成功,在两台机器间创建数据库、创建表、创建数据测试一下,两台机器就会互相同步数据了!