django实现mysql主从配置

什么是主从配置?

  主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。而redis的读写分离可参考:redis读写分离

主从配置的好处

  1. 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  2. 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据。
  3. 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能

主从配置的原理

  主从配置是基于二进制日志来实现的,主服务器在执行增删改查时会将相关指令都记录在二进制日志文件中,然后从服务器通过读取和执行该文件来保持和主服务器一致。

Django配置步骤

  django的配置非常简单,但在这之前先要进行mysql的主从配置。本篇文章以ubuntu为操作系统,其上的mysql为主服务器,然后再用docker来建立mysql从服务器。
  ubuntu安装mysql很轻松:

1. sudo apt-get install mysql-server
2. apt-get isntall mysql-client
3. sudo apt-get install libmysqlclient-dev

  docker下载mysql镜像(docker的安装可以百度)终端输入:

docker image pull mysql:5.7.22 #因ubuntu用的是5.7版本,所以指定docker的也为5.7

  运行mysql docker镜像,需要在宿主机中建立文件目录用于mysql容器保存数据和读取配置文件。

cd
mkdir mysql_slave
cd mysql_slave
mkdir data
cp -a /etc/mysql/mysql.conf.d ./    #将位于/etc的mysql配置文件拷到家目录下

  我们要将docker运行的mysql作为slave来运行,开启前需要修改配置文件。编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf 文件,修改:

port  =  8306  #区别开主服务器的3306,定义为8306
general_log  = 0
server-id  = 2 #主服务器id设为1,从服务器只要不是1都行,这边取2

  创建docker容器,要指定ubuntu和docker里面映射的路径(-v后面就是指定的映射路径),详细命令如下:

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

  此时尝试链接mysql:

mysql -uroot -p --port=8306

  输入密码后能连上,则说明安装成功。接下来备份初始主服务器的内容到从服务器,后续的备份则通过二进制日志来传输:

mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql 
#上面的命令是将主服务器的所有数据库拷贝出来,下面的命令则是拷贝到docker里面
mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql

  接下来配置主服务器的配置:

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf  #进入配置文件
server-id = 1  #在[mysqld]下方输入这两条指令
log_bin =  /var/log/mysql/mysql-bin.log

  然后重启mysql:

sudo service mysql restart

  接着创建slave使用的账号密码:

mysql –uroot –p   #输入密码,进入mysql
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave'; 
#*.*表示所有表,第一个slave表示账号,第二个slave表示密码
FLUSH PRIVILEGES; #执行权限

  获取主服务器的二进制信息:

SHOW MASTER STATUS;

在这里插入图片描述
File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到。
  进入docker中的mysql配置从服务器的slave:

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='mysql-bin.000006', master_log_pos=590;
# 依次填入从服务器的账号/密码/日志文件名/文件位置

  启动slave服务器,并查看同步状态

start slave;
show slave status \G

django实现mysql主从配置_第1张图片
  出现上图所示则说明主从配置成功!

Django配置命令

1.在配置文件中增加slave数据库的配置

DATABASES = {
    'default': {
        ...
    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': 8306,
        'USER': 'root',
        'PASSWORD': 'mysql',
        'NAME': 'meiduo_mall'
    }
}

2.创建数据库操作的路由分发类(用于创建数据库的路由分发)

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

3.配置读写分离路由

DATABASE_ROUTERS = ['utils.db_router.MasterSlaveDBRouter'] 

总结

  关于django实现读写分离就写到这了,谢谢观看~

你可能感兴趣的:(mysql,主从配置,mysql,django,python)