数据库主从

一、防止公司代码泄露

代码很容易泄露,如何保证python代码不泄露?

  • 项目部署完了,直接源代码删除(狠种)
  • pyinstaller :win上的可执行文件
    • linux 上的可执行
  • 把代码做到docker中,每次运行容器都要先鉴权
    • docker run -id -p 8080:8080 -e secret=sdfasdf django_books
      settings.py

二、MySQL主从搭建

项目只有一个数据库服务端

无论写还是读,请求都压在这个mysql服务器上,连接数过高,mysql顶不住

假设做成两台,一台只用来写数据,另一台用来读数据  -必须要保证两个服务的数据实时同步?

主库和从库

  • 主库用来写,从库用来读,只需要做好主从同步,就能保证数据的准确
  • 可以是一主一从也可以是一主多从

项目中最多,最影响效率的其实是查,把查分散出去,压力小很多

主从配原理

  • master(主库)会将变动记录到二进制日志(binlog)里面;
  • slave有一个I/O线程将二进制日志拉取;
  • slave有一个I/O线程把master的二进制写入到relay日志里面;
  • slave有一个SQL线程,按照relay日志回放自己的库中

搭建步骤

1、准备两台机器——>docker 容器模拟

2、配置两台机器环境——>创建两个文件夹,做目录映射,一个给主,一个给从

mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data
touch /home/mysql/my.cnf

mkdir /home/mysql2
mkdir /home/mysql2/conf.d
mkdir /home/mysql2/data
touch /home/mysql2/my.cnf

3、编写mysql 主库的配置文件——>重点:server-id 不能重复,开启bin-log日志

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

server-id=100
log-bin=mysql-bin

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

4、编写mysql 从库配置文件  server-id不能重复,开启log-bin开启 relay_log

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

5、启动主库和从库

  • 启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456)
docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  • 启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456)
docker run  -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

6、远程链接主库 cmd要执行命令

mysql -h 10.0.0.205 -P 33307 -uroot -p
#在主库创建用户并授权
##创建test用户
create user 'test'@'%' identified by '123';
##授权用户
grant all privileges on *.* to 'test'@'%' ;
###刷新权限
flush privileges;
#查看主服务器状态(显示如下图)   bin log日志的位置
show master status; 

7、远程链接从库 cmd要执行命令

	mysql -h 10.0.0.205 -P 33306 -uroot -p
    #配置详解
       '''
        change master to 
        master_host='MySQL主服务器IP地址', 
        master_user='之前在MySQL主服务器上面创建的用户名', 
        master_password='之前创建的密码', 
        master_log_file='MySQL主服务器状态中的二进制文件名', 
        master_log_pos='MySQL主服务器状态中的position值';
       '''
    #命令如下
    change master to master_host='10.0.0.205',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
    #启用从库
    start slave;
    #查看从库状态(如下图)
    show slave status\G;

8、测试

  • 主库写
  • 从库读

三、django实现读写分离

django 操作主从库

  • 写数据写到主库
  • 读数据从从库读

migrate --database=db01

使用步骤

1、修改配置文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db01': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db1.sqlite3',
    }
}

2、在models.py 中创建表

class Books(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)

3、迁移

	makemigrations   # makemigrations app01    不写表示迁移所有
    migrate          # migrate --database=db01 把变化迁移到哪些库中,默认迁移到defalut中

4、写代码,测试

	-新增数据,修改,删除   都是写操作
    -查询数据             读操作
    
    -方式一:手动操作,指定哪个库
    	Books.objects.using('db01')
        
    -方式二:自动方式
    	-在项目路径下编写 app_router.py
        class DatabaseAppsRouter(object):
            # 读数据的时候,返回哪个库,它就用哪个库
            def db_for_read(self, model, **hints):
                # 分库分表  id大于10000 写到哪个库中,
                # 通过model判断是操作哪个表
                print(model._meta)
                return 'db01'

            def db_for_write(self, model, **hints):
                return 'default'
            
        -配置文件配置,自动读写分离
        DATABASE_ROUTERS = ['django_databases.app_router.DatabaseAppsRouter']

四、远程链接linux开发

开发用win,上线基本都用linux,有的模块,在win用好好的,linux装不了

使用pycharm开发,写代码在win上,但是运行代码,在linux上,运行的结果再返回回来

  • 本质:win中得pycharm上的python解释器,使用的是虚拟机上的解释器

五、远程链接docker开发

搭建步骤

运行客户端[pycharm]远程链接docker服务器 

1、配置运行远程客户端连接docker

	vim /lib/systemd/system/docker.service
    # 原来是
    # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
	#改成
    ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

2、/etc/profile 写入

    将管理地址写入 /etc/profile
    执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2376' >> /etc/profile
    执行命令:source /etc/profile

3、重启docker

systemctl daemon-reload && systemctl restart docker

4、测试

	# 虚拟机执行
	curl 127.0.0.1:2376/version
    # win执行
    http://10.0.0.205:2376/version
posted @ 2022-12-22 21:05  初学者-11  阅读(62)  评论(0编辑  收藏  举报