由于我们平时在操作数据库的时候,大多数时候查询的操作远多于写的操作,也就是需要处理大量查询请求的场景,为了保证数据库操作的效率,我们一般把读的操作放在一个数据库执行(从库),比较耗时与频繁I/O的操作放在另一个数据库(主库)。这样通过读/写分离,有利于减轻主库操作的压力,主从库可以各行其事,从而提高了数据库的操作效率!
扩展:
通过多个服务器(MySQL)协同工作处理大量请求问题➡分布式
CAP理论:
即:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
方法:
创建两个docker容器,一主(master)一从(slave)。
具体操作:
(1)主库master执行sql,并将数据的操作记录写入到一个二进制文件中(binary log),也就是配置文件中指定的log-bin日志文件。
(2)从库slave开启IO线程读取binlog文件;
(3)从库slave将读取到的binlog日志文件写入到slave服务器的relaylog文件中;
(4)从库slave再开启SQL线程,读取relaylog中的数据,更新slave数据库中的内容,将日志文件中的记录变为执行数据操作的行为,从而实现主从数据一致性的目的。
show variables like 'log_bin';
show variables like '%datadir%';
show binary logs;
show binlog events in 'wnhz-master-bin.000001';
容器内位置:/etc/mysql/my.cnf
docker cp 容器名称: 文件地址 目标地址 ./ --当前位置
docker run -it --name mytest -e MYSQL_ROOT_PASSWORD=123 -d mysql
docker cp mytest:/etc/mysql/my.cnf ./
docker run \
-it \
--name mysql_3306 \
--privileged \
--network **_docker_net \
--ip 172.18.12.2 \
-p 3306:3306 \
-v /usr/local/software/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql/3306/data:/var/lib/mysql \
-v /usr/local/software/mysql/3306/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql
(1)进入mysql -uroot -p123
show master status;
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
进入conf文件夹,cat my.cnf
进入编辑,vim my.cnf
开始编辑,i(insert)
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
default_authentication_plugin=mysql_native_password
# Custom config should go here
!includedir /etc/mysql/conf.d/
server-id=200 #server‘id
log_bin=wnhz-master-logbin #logbin name
binlog_format=row
退出编辑,esc
保存并退出,:wq
不保存退出,:q!
容器内位置:/etc/mysql/my.cnf
docker cp 容器名称: 文件地址 目标地址 ./ --当前位置
docker run -it --name mytest -e MYSQL_ROOT_PASSWORD=123 -d mysql
docker cp mytest:/etc/mysql/my.cnf ./
docker run \
-it \
--name mysql_3310 \
--privileged \
--network **_docker_net \
--ip 172.18.12.3 \
-p 3310:3306 \
-v /usr/local/software/mysql/3310/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql/3310/data:/var/lib/mysql \
-v /usr/local/software/mysql/3310/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
default_authentication_plugin=mysql_native_password
# Custom config should go here
!includedir /etc/mysql/conf.d/
server-id=201 #server‘id
log_bin=wnhz-slave-01-logbin #logbin name
relay_log=wnhz-slave-01-relay
read-only=1
create user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.00000*',MASTER_LOG_POS=***;
原因:从库使用的root用户登录,权限最高
解决方案:
从库创建一个新用户,权限只能是读
SQL语句:
stop slave;
reset slave;
show master status; #maseter
change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.00000*',MASTER_LOG_POS=***; #slave
start slave;
———————————————————————————————