数据库主从同步配置 + 冒泡排序

主从同步意义

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

使用主从的好处

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

机制

  • Mysql 服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致
  • 在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接受到该日志的一个副本,从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句

配置主从同步的基本步骤

  • 有很多配置主从同步的方法,可以总结为如下几步
    • 在主服务器上,必须开启二进制日志机制和配置一个独立的 ID
    • 在每一个从服务器上,配置一个唯一的 ID,创建一个用来专门复制主服务器数据的账号
    • 在开始复制进程前,在主服务器上记录二进制文件的位置信息
    • 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用 mysqldump 导出数据库,或者直接复制数据文件)
    • 配置从服务器要连接的主服务器的 IP 地址和登录授权,二进制日志文件名和位置

配置方法

  • 镜像拉取
    docker load -i mysql_docker_5722.tar
  • 运行 mysql docker 镜像,需要在宿主机中建立文件目录用于 mysql 容器保存数据和读取配置文件
  • 在家目录中(/home/xiaoge)中创建目录,将 mysql 的配置文件放到此目录中
cd ~
mkdir mysql_slave
cd mysql_slave
mkdir data
# cp -r: 递归拷贝	./:	把 mysql.conf.d 下的所有文件拷贝到当前文件夹下
cp -r /etc/mysql/mysql.conf.d ./
  • 我们要将 docker 运行的 mysql 作为 slave 来运行,开启前需要修改配置文件
  • 编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf 文件,修改
port = 8306		#端口 可以随意配置
general_log = 0	#不输出日志
server-id = 2	#配置从服务器 id,必须唯一,可以为 IP 地址最后尾段数字
  • 我们让此台 mysql 运行在 8306 端口上,且 mysql 编号为 2
  • 创建 docker 容器
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/xiaoge/mysql_slave/data:/var/lib/mysql -v /home/xiaoge/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
  • 到 data 文件夹内可见已经有数据了
  • 测试,在 ubuntu 中使用 mysql 命令尝试连接 docker 容器中的 mysql
    mysql -uroot -pmysql -h 127.0.0.1 --port=8306

备份主服务器原有数据到从服务器

mysqldump -uroot -pxxxx --all-databases --lock-all-tables > ~/master_db.sql

  • 此时是对主服务器操作,所以输入的密码是主服务器的
  • –all-databases:导出所有数据库
  • –lock-all-tables:执行操作时锁住所有表,防止操作时有数据修改
  • ~/master_db.sql:导出的备份数据(sql 文件)位置,可自己指定

在 docker 容器中导入数据

mysql -uroot -pmysql -h127.0.0.1 --port=8306 < ~/master_db.sql

配置主服务器 master(Ubuntu 中的 MySQL)

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

  • 修改 server-id = 1
  • log-bin 视情况而定,如果后面 SHOW MASTER STATUS; 为空的话,将注释去掉
  • 重启 mysql 服务
    sudo service mysql restart
  • 登入主服务器 Ubuntu 中的 mysql,创建用于从服务器同步数据使用的账号
mysql -uroot -pxxxxxxx
GRANT REPLICATION SLAVE ON *.* To 'slave'@'%' identified by 'slave';
FLUSH PRIVILEGES;

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

SHOW MASTER STATUS;

在这里插入图片描述

  • File 为使用的日志文件名字,Position 为使用的文件位置,这两个参数须记下,配置从服务器时会用到

配置从服务器 slave(docker 中的 mysql)

  • 进入 docker 中的 mysql
    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.00000x",master_log_pos=1xx;

  • master_host:主服务器 Ubuntu 的 ip 地址
  • master_log_file:前面查询到的主服务器日志文件名
  • master_log_pos:前面查询到的主服务器日志文件位置
    启动 slave 服务器,并查看同步状态
start slave;
show slave status \G

注:要看 Slave_IO_Running 和 Slave_SQL_Running 是否为 YES,YES 才成功

  • 主从同步
    在这里插入图片描述

  • python 支持并发
  • 并发:交替做不同事情的能力
  • 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行
  • GIL锁:在C语言写的python解释器(CPython)中存在全局解释器锁(GIL),由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能
  • IO 操作:Input/Output,输入和输出
  • 集群:多台服务器跑的都是一套完整的代码,这就叫集群
  • 分布式:多台服务器和起来跑的才是一套完整代码,就叫分布式

参考

(计算密集型,IO密集型,单线程占用cpu,多线程占用cpu,多进程占用cpu,GIL锁,解决方案)https://blog.csdn.net/lily559/article/details/82118385

冒泡排序

原理

  • 冒泡排序(Bubble Sort)是一种简单的排序算法
  • 它重复的遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来
  • 遍历数列的工作是重复的进行直到没有再需要交换,也就是说该数列已经排序完成
  • 这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端

使用

  • 冒泡排序算法的运作如下
    • 比较相邻的元素
      如果每一个比第二个大,就交换他们两个,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数
    • 对所有的元素重复以上的步骤,除了最后一个
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
def sort(alist):
    """
    冒泡排序,将列表中的数从小到大依次排列
    第一次循环,进行比较 len(alist)-1 次,最后一个数即是最大数
    第二次循环,进行比较 len(alist)-2 次,倒数第二个数即是第二大数,以此类推
    第 len(alist)-1 次循环,即最后一次循环,进行比较一次,此时冒泡排序完成
    :param alist: 
    :return: 
    """
    #逆序循环到0截止 j 为循环次数,第一次比较次数为 len(alist)-1,i 为从0到 j,所以j逆序
    for j in range(len(alist)-1,0,-1):
        #i 为索引
        for i in range(j):
            #如果前一个数比后一个数大,将两者对调,否则位置不变
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
    return alist
a = [324,23,212,45,32,4,6,8]
print(sort(a))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值