Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3592987
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Mysql/postgreSQL

2020-01-20 16:22:57

MySQL读写分离
场景
我们的项目中已经存在非常多的数据库表了,数据量也会逐渐增多,所以我们需要做一些数据库的安全和性能的优化。对于数据库的优化,我们选择使用MySQL读写分离实现。涉及内容包括主从同步和Django实现MySQL读写分离。


MySQL主从同步
主从同步机制
主从同步介绍和优点


在多台数据服务器中,分为主服务器和从服务器。一台主服务器对应多台从服务器。
主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据。
主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
应用程序可以随机读取某一台从服务器的数据,这样就可以分摊读取数据的压力。
当从服务器不能工作时,整个系统将不受影响;当主服务器不能工作时,可以方便地从从服务器选举一台来当主服务器
使用主从同步的优点:
提高读写性能
因为主从同步之后,数据写入和读取是在不同的服务器上进行的,而且可以通过增加从服务器来提高数据库的读取性能。
提高数据安全
因为数据已复制到从服务器,可以在从服务器上备份而不破坏主服务器相应数据。
主从同步机制






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


Docker安装运行MySQL从机
本项目中我们搭建一主一从的主从同步。


主服务器:ubuntu操作系统中的MySQL。


从服务器:Docker容器中的MySQL


获取MySQL镜像


# 主从同步尽量保证多台MySQL的版本相同或相近
 sudo docker image pull mysql:5.7.22 # 5.7.22版本 
 sudo docker load -i 文件路径/mysql_docker_5722.tar
1
2
3
指定MySQL从机配置文件


在使用Docker安装运行MySQL从机之前,需要准备好从机的配置文件。
为了快速准备从机的配置文件,我们直接把主机的配置文件拷贝到从机中。
# 创建MySQL从机配置文件夹
mkdir mysql_slave
# 创建装数据库数据文件夹
mkdir data


cp -r /etc/mysql/mysql.conf.d ./
1
2
3
4
5
6
修改MySQL从机配置文件


编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf文件。
由于主从机都在同一个电脑中,所以我们选择使用不同的端口号区分主从机,从机端口号是8306。
# 从机端口号
port = 8306
# 关闭日志
general_log = 0
# 从机唯一编号
server-id = 2
1
2
3
4
5
6
Docker安装运行MySQL从机


创建 root 用户的密码为 mysql


 sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
1
测试从机是否创建成功


mysql -uroot -pmysql -h 127.0.0.1 --port=8306
1
主从同步实现
配置主机(ubuntu中MySQL)


配置文件如有修改,需要重启主机。


sudo service mysql restart
# 开启日志
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# 主机唯一编号
server-id = 1
# 二进制日志文件
log_bin = /var/log/mysql/mysql-bin.log
1
2
3
4
5
6
7
从机备份主机原有数据


# 在做主从同步时,如果从机需要主机上原有数据,就要先复制一份到从机
# 1. 收集主机原有数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql


# 2. 从机复制主机原有数据
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
1
2
3
4
5
6
主从同步实现


# 登录到主机
$ mysql –uroot –pmysql
# 创建从机账号
$ GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
# 刷新权限
$ FLUSH PRIVILEGES;
# 展示ubuntu中MySQL主机的二进制日志信息
$ SHOW MASTER STATUS;
# 可以看到master_log_file和master_log_pos=Position




# 登录到从机
$ mysql -uroot -pmysql -h 127.0.0.1 --port=8306
# 从机连接到主机
$ change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file=XXX, master_log_pos=XXX;
# 开启从机服务
$ start slave;
# 展示从机服务状态
$ show slave status \G
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Django实现MySQL读写分离
增加slave数据库的配置
DATABASES = {
    'default': { # 写(主机)
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'HOST': 'XXXX', # 数据库主机
        'PORT': 3306, # 数据库端口
        'USER': 'XX', # 数据库用户名
        'PASSWORD': 'XXX', # 数据库用户密码
        'NAME': 'XXX' # 数据库名字
    },
    'slave': { # 读(从机)
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'XXXX',
        'PORT': 8306,
        'USER': 'XXX',
        'PASSWORD': 'XXX',
        'NAME': 'XXX'
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
创建和配置数据库读写路由
创建数据库读写路由


# 在meiduo_mall.utils.db_router.py中实现读写路由




class MasterSlaveDBRouter(object):
    """数据库读写路由"""


    def db_for_read(self, model, **hints):
        """读"""
        return "slave"


    def db_for_write(self, model, **hints):
        """写"""
        return "default"


    def allow_relation(self, obj1, obj2, **hints):
        """是否运行关联操作"""
        return True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
配置数据库读写路由


# 配置数据库读写分离路由
DATABASE_ROUTERS = ['meiduo_mall.utils.db_router.MasterSlaveDBRouter']
1
2
冷备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份数据库信息而言,冷备份是最快和最安全的方法。简单说法就是:离线(没有新的数据来)复制一份保存,有事就直接用这备份来恢复。




1
冷备份的优点:
是非常快速的备份方法(只需拷贝文件)
容易归档(简单拷贝即可)
容易恢复到某个时间点上(只需将文件再拷贝回去)
能与归档方法相结合,作数据库“最新状态”的恢复。
低度维护,高度安全。
冷备份的缺点:
单独使用时,只能提供到“某一时间点上”的恢复。
在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
不能按表或按用户恢复。
值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的 。而且在恢复后一定要把数据库文件的属组和属主改为mysql。


热备份
热备份是在数据库运行的情况下,备份数据库操作的sql语句,当数据库发生问题时,可以重新执行一遍备份的sql语句。简单说就是:在线的保存对数据库操作的sql语句,有事就再跑一遍这些sql语句。


# 在做主从同步时,如果从机需要主机上原有数据,就要先复制一份到从机
# 1. 收集主机原有数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql


# 2. 从机复制主机原有数据(在配置文件所在目录下,数据会写入data文件中)
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql
1
2
3
4
5
6
热备份的优点:
可在表空间或数据文件级备份,备份时间短。
备份时数据库仍可使用。
可达到秒级恢复(恢复到某一时间点上)。
可对几乎所有数据库实体作恢复。
恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的缺点:
不能出错,否则后果严重。
若热备份不成功,所得结果不可用于时间点的恢复。
因难于维护,所以要特别仔细小心,不允许“以失败而告终”

阅读(2385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~