在Rancher中添加Mysql-Master-Slave,使得django數據庫讀寫分離。


1.拉取mysql鏡像

 docker pull deoj/mysql:v1 

2.(1)在Rancher中創建Master容器:

 

添加容器拉去本地鏡像,以及開放端口:

 

 

添加外部配置文件,以及數據持久化:

 

 

(2)在Rancher中創建Slave-1、Slave-2容器:

添加容器拉去本地鏡像,以及開放端口:

  

 

添加外部配置文件,以及數據持久化:

 

 

如圖:

 

 3.(1)進入master容器中:

(2) show databases; #查看數據庫test有沒有創建成功 

  

紅色標記證明創建成功,然后執行如下代碼來查看master狀態;

show master status;

其中紅色標記的參數需要在配置文件中用到先記錄下來。

下面是master的配置文件:

[mysqld]
server-id       = 2
port            = 3302
binlog-ignore-db = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#default-storage-engine = InnoDB
log-bin         = mysql-bin-master
binlog_cache_size = 1M
binlog_format = mixed
expire_logs_days = 7
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 0.0.0.0
#bind-address   = 192.168.1.126
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

replicate-wild-ignore-table = mysql.%
sync_binlog                 = 1

*因為我的圖片是第二天截取的,docker重啟過,導致參數不一致,在配置時填寫當前狀態的參數即可。

(3)進入slave容器中:

change master to master_host='192.168.1.126', master_user='root', master_password='1', master_port=3302, master_log_file='mysql-bin-master.000006', master_log_pos=126891, master_connect_retry=30;

執行上面的代碼來添加master到slave中。

start slave;

開啟slave模式;

show slave status \G;

查看slave狀態,是否添加成功:

截圖中,紅色框框包含了master的一些參數,橘黃色框框yes,yes表示slave運行狀態(前提是執行了slave start;),如果為no,no則slave沒有運行。

下面是slave的配置文件:

[mysqld]
server-id       = 4
port            = 3304

binlog-ignore-db= mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
default-storage-engine  = InnoDB
log-bin         = mysql-bin-slave-2
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address   = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
binlog_cache_size = 1M
binlog_format     = mixed
expire_logs_days  = 7
slave_skip_errors = 1062
relay_log         = mysql-relay-bin-2
log_slave_updates = 1
read_only = 1

 

 4.(1)進入django項目settings.py中,添加master-slave數據庫(我添加了2個slave):

  

DATABASES = {
    
    'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'test',
         'USER': 'root',
         'PASSWORD': '1',
         'HOST': '192.168.1.126',
         'PORT': '3302',
    },
    'slave-1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '1',
        'HOST': '192.168.1.126',
        'PORT': '3303',
    },
    'slave-2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': '1',
        'HOST': '192.168.1.126',
        'PORT': '3304',
    },
}
DATABASE_ROUTERS = ['ergaleng.myrouter.Router',]
 

(2)在settings.py同級目錄下創建myrouter.py文件(需要將該文件引入到settings.py不然不能用里面的類):

class Router(object):
    def db_for_read(self, model, **hints):
        """
        讀取隨即一個數據庫
        :param model:
        :param hints:
        :return:
        """
        try:
            import random
            print("into slave")
            return random.choice(['slave-1','slave-2'])
        except:
            return 'default'

    def db_for_write(self, model, **hints):
        """
        寫入時選擇主數據庫
        :param model:
        :param hints:
        :return:
        """
        print("into default")
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        return None

*其中,代碼邏輯就是將讀操作與寫操作分離,當涉及到讀操作時,數據庫在slave-1和slave-2中隨機選擇,當涉及寫操作時,數據庫選擇default (master)。

(3)進入django容器中,進行數據庫表創建:

python manage.py makemigrations
python manage.py migrate   #默認default

因為配置了數據庫主從復制,所以在master中創建的數據會自動同步到分數據庫中。

執行 python manage.py shell 進入shell中,

root@python-2:/# cd data/
root@python-2:/data# python manage.py shell
Python 3.6.6 (default, Sep  5 2018, 03:40:52)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from flow import models
>>> models.User.objects.create(username="hello")
into default
<User: hello>
>>> models.User.objects.all()[0]
into slave
<User: hehe>
>>>

如上結果,說明基於Docker 的 Mysql主從架構已經設置完成。

 (4)用 nginx+vue+django-restframework +uwsgi進行實際項目下的測試結果如下,橘黃色為讀操作(讀操作:查操作),紅色框框為寫操作(寫操作:創建、更新、刪除操作):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM