Mysql主从复制————基于Docker的实现

主库

主库采用远程服务器中安装的Mysql 8.0.26

Step1 修改配置文件

vi打开/etc/my.cnf写入👇

1
2
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=100 #[必须]配置服务器ID,可自定

Step2 重启Mysql服务

1
systemctl restart mysqld

Step3 创建从库用户并授权

1
create user ‘#userName’@’#host’ identified by ‘#passWord’;
  • #userName 代表你要创建的此数据库的新用户账号
  • #host 代表访问权限,如下:
    • % 代表通配所有host地址权限(可远程访问)
    • localhost 为本地权限(不可远程访问)
    • 指定特殊Ip访问权限 如10.138.106.102
1
2
grant all privileges on *.* to '#userName'@'#host';
flush privileges;

查看并记录主库状态

1
show master status;

记录下FilePosition

从库

从库使用了Docker

创建容器并挂在数据卷

vi打开/etc/my.cnf写入👇

1
2
3
4
5
6
7
8
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql \
-v $PWD/logs:/logs \
-v $PWD/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=**** \
mysql:8.0.26

修改从库配置文件

vi打开$PWD/conf/my.cnf文件添加👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[mysqld]
## 设置serverid,同一个局域网内要唯一
server_id=101
##指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-slave1-bin
##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式
binlog_format=mixed
##二进制日志过期清理时间
expire_logs_days=7
##跳过主从复制中所有错误或指定类型的错误,避免slave端复制中断
###1062主键重复,1032主重数据不一致
slave_skip_errors=1062
##配置中继日志
relay_log=mall-mysql-relay-bin
##表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
##slave设置为只读
read_only=1

重启Docker容器

开启从库Slave模式

进入容器Bash后登录数据库,执行👇

1
change master to master_host='****', master_user='slave', master_password='****', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=156;
  • master_log_file 参考主库状态的File
  • master_log_pos 参考主库状态的Position
1
start slave;

查看是否开启

1
show slave status;

代理模式

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

  • 意图:为其他对象提供一种代理以控制对这个对象的访问。

  • 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

  • 何时使用:想在访问一个类时做一些控制。

实现

这里将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。

步骤一:创建接口

1
2
3
4
//Image.java
public interface Image {
void display();
}

步骤二:创建实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//RealImage.java
public class RealImage implements Image {

private String fileName;

public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}

@Override
public void display() {
System.out.println("Displaying " + fileName);
}

private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//ProxyImage.java
public class ProxyImage implements Image{

private RealImage realImage;
private String fileName;

public ProxyImage(String fileName){
this.fileName = fileName;
}

@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}

步骤三: 测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
//Test.java
public class Test {

public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");

// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}

Docker中的Redis部署

创建Redis的Docker容器

👇直奔主题👇

shell脚本

1
2
3
4
5
6
7
8
docker run \
--name myredis \
-v /root/redis_docker/mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /root/redis_docker/mydata/redis/data:/data \
-p 6379:6379 \
-d --restart=always redis:5.0 redis-server /etc/redis/redis.conf \
--appendonly yes \
--requirepass ******

说明

  • –name redis 【容器名】
  • -p 6379:6379 【映射端口】
  • -v /usr/local/app/redis/redis.conf:/etc/redis/redis.conf 【conf文件挂载目录】
  • -v /usr/local/app/redis/data:/data 【data挂载目录】
  • -d redis:5.0 【后台运行镜像】
  • –restart=always 【docker重启后自动启动镜像】
  • redis-server /etc/redis/redis.conf 【在容器执行redis-server启动命令,执行conf文件】
  • –appendonly yes 【持久化】
  • –requirepass “root” 【设置密码】

补充

  • docker exec -it redis bash 【进入容器】
  • redis-cli 【连接】
  • auth root 【登录】
  • set hello world
  • get hello