centos7上mariadb10.3多实例安装部署及主从复制

    mariaDB是开源的数据库,是mysql的衍生版。

   Mariadb官方: https://mariadb.com/

  os:centos7

 mariadb:10.3

yum安装实现。

一个版本mysql通过多个端口实现

规划3个实例的端口:3306/3307/3308。

将各自的配置文件、日志文件、pid、socket单独存放。


一、yum安装

    采用 yum安装,centos7默认的yum源是mariadb5.5版本,所以需要修改yum仓库配置文件,以安装10.3.0版本的mariadb

vim /etc/yum.repos.d/CentOS-Base.repo

在仓库配置文件中添加如下行

# MariaDB 10.3 CentOS repository list - created 2019-01-07 01:34 UTC
#  
[mariadb]
name = MariaDB
baseurl =  
gpgkey= 
gpgcheck=1

完成后,更新yum缓存,然后检查maradb是否已经更换

yum info MariaDB-server

image.png

确认后,即可使用yum进行安装

yum install MariaDB-server


二、配置

三个数据库实例都放在独立的目录中

mkdir -pv /data/{3306,3307,3308}/{etc,socket,pid,log,data}

完成后的目录结构如下所示:

image.png

确认mysql的用户账户是否已经被创建

getent passwd mysql

image.png

修改数据库的权限和组信息

chown -R mysql.mysql /data

生成各个实例数据库文件

mysql_install_db --datadir=/data/3306/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3307/data --user=mysql --basedir=/usr
mysql_install_db --datadir=/data/3308/data --user=mysql --basedir=/usr

image.png


根据3个不同的实例准备3个配置文件,用/etc/my.cnf 当模板:

将配置文件考到各自的文件下:

cp /etc/my.cnf /data/3306/etc/
cp /etc/my.cnf /data/3307/etc/
cp /etc/my.cnf /data/3308/etc/


修改各自实例的配置文件,如下所示:

vim /data/3306/etc/my.cnf

[mysqld]
port=3306                    #手动添加部分
datadir=/data/3306/data
socket=/data/3306/socket/mysql.sock
[mysqld_safe]
log-error=/data/3306/log/mariadb.log
pid-file=/data/3306/pid/mariadb.pid
#!includedir /etc/my.cnf.d            #需要注释掉

image.png

其他实例3307,3308的配置文件也按上修改

注意,配置文件中,可以有很多优化,可以查询资料后制定


三、准备启动脚本

首先确认停止mariadb服务

systemctl stop mariadb

在/data/3306/路径下创建mysql启动脚本,脚本内容如下:

touch /data/3306/mysql
vim /data/3306/mysql


#!/bin/bash

port=3306                                  #设定实例端口号
mysql_user="root"                          
mysql_pwd="abc@123"                        #设定数据库密码
cmd_path="/usr/bin"
mysql_basedir="/data"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac

完成后的目录结构如下:

image.png

注意修改3307,3308各个实例的脚本

cp /data/3306/mysqld  /data/3307/(配置文件端口改为port=3307)
cp /data/3306/mysqld  /data/3308/(配置文件端口改为port=3308)

设置合适的权限

chmod 700 /data/3306/mysqld
chmod 700 /data/3307/mysqld
chmod 700 /data/3308/mysqld

启动脚本

./ mysqld start

image.png

检查服务启动状态

image.png

可见 各个端口都是正常开启


测试连接

需要用sock指定文件链接到 mysql

mysql -S /data/3306/socket/mysql.sock
mysql -S /data/3307/socket/mysql.sock
mysql -S /data/3308/socket/mysql.sock

通过查看端口判断进入哪个实例

show variables like 'port';

image.png

设置密码

mysqladmin -uroot -S /data/3306/socket/mysql.sock password 'abc@123'


此时进入3306实例数据库

mysql -S /data/3306/socket/mysql.sock -u root -p

image.png


四、主从复制

主从复制是一个异步的复制过程,数据从一个Mysql数据库复制到另一个mysql数据库,在主和从之间实现整个主从复制使的过程是由三个线程参与完成的。

其中有两个线程在从端,另外一个线程在主端。
要实现主从复制,首先必须打开master端的binlog记录功能,否则无法实现。整个主从复制过程就是从端从主端获取binlog日志,然后再到slave上以相同的顺序获取binlog日志中所记录的各种

SQL操作。

要打开binlog记录功能,可通过配置文件my.cnf中的mysqld模块增加log-bin参数选项来实现。

image.png

主从复制原理

从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

主从复制重点:

1)主从复制是异步的逻辑的sql语句级的复制

2)复制时,主库有一个I/O线程,从库有有两个线程,即I/O和SQL线程。

3)实现主从复制的必要条件是主库需要开启binlog功能

4)作为复制的所有mysql节点的server-id都不能相同

5)binlog文件只记录对数据库有更改的sql语句,不记录任何查询语句。

以本机单机数据库多实例环境测试主从复制

主库于从库IP信息如下:

主库            3306
从库1          3307

从库2          3308


4.1设置server-id值并开启binlog功能参数

修改主库配置文件my.cnf,按照如下修改两个参数

vim /data/etc/my.cnf
[mysqld]
server-id =1            #用于同步的每台机器或者实例server-id都不能相同
log-bin = /data/3306/mysql-bin            #注意,只需要主库设置即可,从库不需要设置此参数

说明:

参数要放在my.cnf的[mysqld]模块下

server-id的值不能相同

参数不能重复

修改完成后重启数据库

/data/3306/mysql restart

登陆数据库,检查参数的更改情况,如下:

mysql -S /data/3306/socket/mysql.sock -u root -pabc@123


show variables like 'server_id';
show variables like 'log_bin';

image.png

按照这个方法检查其他实例数据库



4.2主库建立用于主从复制的账号

从库想要和主库同步,必须有一个可以连接主库的账号,并且这个账号是主库上创建的,权限是运行主库连接并同步数据库。

登陆主库后,建立用于从库复制的账号rep

grant replication slave on *.* to 'rep'@'172.31.208.%' identified by 'abc@123';
flush privileges;

image.png


检查主库rep账号

image.png


4.3实现对主数据库锁表只读

对主数据库锁表只读

flush table with read lock;


查看主库状态

image.png


锁表后,导出主库数据(新开一个ssh连接)

mkdir /data/backup -p
mysqldump -uroot -p'abc@123' -S /data/3306/socket/mysql.sock --events -A -B |gzip >/data/backup/mysql_bak.$(date +%F).sql.gz

为了确保导出数据期间,数据库没有数据插入,导出主库完毕后可以再次检查主库状态信息,结果如下:

image.png

可以看到主库没有数据写入

完成主库导出后,解锁主库,恢复可写

unlock tables;

完成导出后,则可以使用mysqldump将主库数据备份到从库上


4.4从库上配置

数据库的server-id一般在一套主从复制体系内时唯一的,从库的server-id需要和主库和其他从库的不同,并且要注释掉从库的binlog参数配置,如果从库不做级联复制,并且不作为备份作用,则不需要开启binlog,开启反而会增加从库磁盘I/O压力。

    但是有两种情况需要打开从库的binlog记录功能,记录数据库更新的SQL语句。

1)A-B-C级联同步,中间的B数据库服务,需要开启binlog记录功能

2)在从库做数据库备份要开启binlog记录功能,因为数据库备份必须要有全备和binlog日志,才是完成的备份。

完成从库3307的配置文件修改后,检查从库参数改变情况

image.png

使用mysqldump命令将主库备份文件恢复到从库

gzip -d mysql_bak.2019-01-07.sql.gz
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock <mysql_bak.2019-01-07.sql


4.5 主从库同步

从库的配置信息如下:

CHANGE MASTER TO
MASTER_HOST='172.31.208.81',               #主库ip
MASTER_PORT=3306,                          #主库端口
MASTER_USER='rep',                         #主库上的复制权限用户rep
MASTER_PASSWORD='abc@123',                #rep用户密码
MASTER_LOG_FILE='mysql-bin.000001',        #show master status时查看到的二进制文件名称,注意不能多空格
MASTER_LOG_POS=648;                       #show master status时看到的二进制日志偏移量,注意不能多空格

也可以按照如下方式配置从库连接主数据库进行配置

image.png


实际上,以上操作信息实际上是写入从库新的master.info文件中

image.png



启动从库主从复制开关,并查看复制状态

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "start slave;"
mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"

image.png

主从复制是否成功,最关键的是下面的3项状态参数

mysql -uroot -pabc@123 -S /data/3307/socket/mysql.sock -e "show slave status\G;"|egrep "IO_Running|SQL_Running|_Behind_Master"

image.png

说明:

 Slave_IO_Running :IO线程状态,IO线程负责从库到主库读取binlog日志,并写入从库的中继日志,状态为yes表示IO工作征程

Slave_SQL_Runing :SQL线程状态,SQL线程负责读取中继日志中的数据并转换为SQL 语句到从数据库,状态为YES 表示SQL线程工作正常

Seconds_Behind_Master: 复制过程中从库比主库的延迟秒数



4.6总结

1、主库配置log-bin和server-id参数,从库只用配置 server-id,配置完成后重启数据库

2、主库增加同步用户账号,例如rep 授权 repliaction slave权限

3、登陆主库,整库锁表flush table with read lock,检查show master status 查看binlog的位置状态

4、同步之前,备份主库,可以使用mydump导出到指定位置

5、完成主库导出后,执行unlock tables解锁主库

6、把主库导出的数据恢复到从库

7、根据主库show master status  查看的binlog位置状态,从库执行change master to 语句

8、从库开启复制开关,执行start slave;

9 、从库show slave status\G,检查同步状态




猜你喜欢

转载自blog.51cto.com/11555417/2339834