最近公司测试库改建,之前测试库上面装的是老的 MySql,我顺手就把它换成了 MariaDB,后来因为连的人太多就爆了 Too Many Connections,本来很简单的事情,就让技术部一小伙子上去把连接数调大了一点,很简单,但是后来我发现他居然直接写在了 My.cnf 下面,显然他是不知道 MariaDB 早就从 My.cnf 下面扩展到了 my.cnf.d 文件夹下面,于是就跟他一番讲解,然后就引出了配置集群的话题,所以觉得有必要写一下 MariaDB 的一些配置和集群的配置方法。
MariaDB 本身就是 MySql 的一个分支,所以很多东西都是 MySql 延展下来的,既然要说的话就先从安装说起吧,在 CentOS 下安装还是很简单的,官网有很明确的说明以及各种安装方法,我个人比较喜欢 yum 源的安装方法,下面我们开始。
我们以最小集群来说,两台服务器先做主从配置,然后再做互为主从的配置, 两台主机的 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"
登录一下,不出意外应该成功了。
上面只是简单的安装,下面我们再简单的配置一下为集群做准备,先进入 / 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;
如果没有报错,那么双主执行成功,在两台机器间创建数据库、创建表、创建数据测试一下,两台机器就会互相同步数据了!
来源: http://www.tianshangkun.com/2017/07/12/Centos下搭建MariaDB集群/