Ubuntu基于docker的mysql主从数据库配置

1、主从数据库原理

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),
而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从
数据库(此处依赖组从复制).


2、读写分离的原因

数据库写入效率要低于读取效率,一般系统中数据读取频率高于写入频率,单个数据库实例在写入的时候会影响读取性能,
这是做读写分离的原因.
什么时候用读写分离
数据库不一定要读写分离,如果程序使用数据库,更新多,而查询少的情况下不会考虑使用。利用数据库主从同步,再
通过读写分离可以分担数据库压力,提高查询及写入性能。


3、实现机制

MySQL服务器之间的主从同步是基于`二进制日志机制`,主服务器使用二进制日志来记录数据库的变动情况
从服务器通过读取和执行该日志文件来保持和主服务器的数据一致

 Ubuntu基于docker的mysql主从数据库配置_第1张图片

 下边我在我的电脑上给大家实现一下,仅供参考

一: 拉取MYSQL镜像

docker pull mysql:latest

这里可能出现的错误就是没有权限,当提示无权限的时候我们需要在命令最前边加上sudo(是否加sudo要视具体情况而定)

Ubuntu基于docker的mysql主从数据库配置_第2张图片

我们只需静静等待即可

二:创建主动mysql容器的本地文件夹 

a、文件夹用于存放配置文件以及数据库数据
    mkdir mysql_master
    mkdir mysql_slave
b、在对应的文件夹中,创建配置文件以及数据库文件
    进入主数据文件夹 cd mysql_master
    mkdir data
    mkdir mysql.conf.d
    进入从数据文件夹 cd mysql_slave
    mkdir data
    mkdir mysql.conf.d
c、创建配置文件
    进入对应的mysql.conf.d文件夹中,创建配置文件
    touch mysqld.cnf

三:配置文件内容

a、主机配置  vi mysqld.cnf
    [mysqld]
    ## 同一局域网内注意要唯一
    server-id=100
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin

b、从机配置 vi mysqld.cnf
    [mysqld]
    ## 设置server_id,注意要唯一
    server-id=101  
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin  

注意在配置文件中的代码要顶格写例如:

Ubuntu基于docker的mysql主从数据库配置_第3张图片

 

四:创建对应的docker容器

#1.启动master
sudo docker run -d --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql_master/data:/var/lib/mysql -v /home/mysql_master/mysql.conf.d:/etc/mysql/conf.d mysql
        
#2.启动slave         
sudo docker run -d --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql_slave/data:/var/lib/mysql -v /home/mysql_slave/mysql.conf.d:/etc/mysql/conf.d mysql
注意点:映射文件夹路径必须写绝对路径
        映射端口不要出现冲突

当出现以下报错信息时,我们可以检查创建docker时的文件映射路径是否和自己创建的文件路径有差别,也有可能是我们创建的文件夹的名字可能有重复,我们也可以尝试换一个文件夹的名字来解决报错

 

五:配置master主库

进入到主数据库中

docker exec -it mysql-master bash
# 登陆到主机(进入到容器之后直接使用myql命令)
mysql -u xxx -p xxx
# 创建从机账号
CREATE USER slave IDENTIFIED BY 'slave';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' ;
# 刷新权限
FLUSH PRIVILEGES;
# 查看二进制日志信息, 记录 文件名 和 偏移量, 后面会用到
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |      722 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

六:配置slave从库

# 进入到容器内
docker exec -it mysql-slave bash
# 登陆到从机(进入到容器之后直接使用myql命令)
mysql -u xxx -p xxx
# 从机连接到主机
$ change master to master_host='xx.xx.xx.xx', master_port=3307, master_user='slave', master_password='slave',master_log_file='mysql-bin.000003', master_log_pos=4337;
# 停止从机服务
$ stop slave;
# 开启从机服务
$ start slave;

以上配置完毕之后可以测试一下:

在主库中创建一个表,然后进入到从库中检查是否生成相同的表,如果生成则代表,主从数据库配置一切正常,反之,我们可以通过     docker logs mysql来查看MySQL的日志,以此来确定是哪一部份出现了问题

你可能感兴趣的:(数据库,mysql,服务器)