XaaS Cloud Computing Loading ...
X
درخواست شما ثبت شد

درخواست شما با موفقیت ثبت شد. گروه پشتیبانی ما درخواست شما را بررسی و در اسرع وقت با شما تماس خواهند گرفت

توزیع بار در MariaDB با استفاده از HAProxy

تکنولوژی container

مقدمه:

در این روش با استفاده از HAProxy یک خوشه ۳ تایی MariaDB که انشعاب جامعه محور پایگاه داده MySQL است را با پیاده سازی Master-Slave توزیع بار میکنیم

مطابق درخواست ، یک خوشه با سه گره MySQL که به صورت Master-Slave تکثیر (replicate) شده اند با استفاده از HAProxy توزیع بار شد ، لازم به ذکر است که ابتدا قصد پیاده سازی مدل Master-Master بر روی سه گره اوبونتو ۱۸.۰۴ را داشتم ولی به دلیل کم تجربگی و کمبود منابع آموزشی برای نسخه ۱۸.۰۴ این عمل موفقیت آمیز نبود البته با کسب تجربه در این روش متوجه مشکلات پیش آمده در روش قبل شدم.

اطلاعات ماشین های مجازی نیز به این شکل است:

MySQL Nodes:

  1. Hostname: master
    1. OS: CentOS 7
    2. IP: 10.0.0.100
  2. Hostname: slave 1
    1. OS: CentOS 7
    2. IP: 10.0.0.101
  3. Hostname: slave 2
    1. OS: CentOS 7
    2. IP: 10.0.0.102

Load Balancer:

  1. Hostname: haproxy
    1. OS: Ubuntu 18.04
    2. IP:
      1. Interface 1: 10.0.0.10
      2. Interface 2: 192.168.122.164

Host Machine (gateway):

  1. OS: ubuntu 18.04
  2. IP:
    1. Interface 1: 10.0.0.1
    2. Interface 2: 192.168.122.1

نحوه کار:

راه اندازی mysql replication:

ابتدا برای اطمینان SElinux را روی سه گره غیرفعال و سپس پکیج mariadb-server را بر روی هر سه نصب کردم.

بعد از اعمال mysql_secure_installation محتویات فایل my.cnf در دایرکتوری etc را برای گره master به شکل زیر ویرایش کردم:

server_id=1

log-bin=mariadb-bin

replicate-do-db=test

bind-address=10.0.0.100

skip_name_resolve

log-basename=master

binlog-format=row

binlog-do-db=test

 

برای هر سرور id را با توجه به شماره ماشین تغییر دادم.

همچنین اسم پایگاه داده مورد نظر برای تکثیر test است.

چون hostname ها در hosts ثبت نشده بود گزینه name_resolve را غیر فعال کردم.

. ها نیز برای پایگاه داده تنظیم و نام فایل نیز مشخص شدهBinarylog

در ضمن هنگامی که مقادیر log-bin و log-basename مشخص نشده باشد ممکن است گره های slave با خطای عدم تطبیق مواجه شوند زیرا محل دقیق خواندن فایل های log در master را نمیشناسند.

برای برقراری ارتباط از راه دور بین گره های slave و master باید آدرس ip را bind کنیم.

برای گره های slave صرفا این موارد کافی هستند:

server_id=2

replicate-do-db=test

تمامی این اطلاعات را باید در بخش [mysqld] اضافه کرد.

سپس یک کاربر با نام slave که به صورت global در دسترس است را با دستور:

mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('%','slave'); FLUSH PRIVILEGE

;"

ایجاد کردم.

برای بارگذاری مجدد جداول دسترسی از FLUSH PRIVILEGES استفاده میکنیم.

حال باید دسترسی replication را به کاربر بدهیم:

mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"

کلمه عبور نیز در اینجا password بود که هنگام اعمال mysql_secure_installation انتخاب شده بود.

با استفاده از دستور show master status نام فایل باینری در master و همچنین position ای که در آن قرار دارد را مشاهده میکنیم.

در دو گره slave با استفاده از خط فرمان mysql باید تنظیمات slave را تغییر دهیم.

ابتدا slave را با دستور stop متوقف میکنیم:

Stop slave;

حال نوبت تغییر رکورد master است:

change master to master_host='10.0.0.100' , master_user='slave' , master_password='password' , master_log_file='mariadb-bin.000001' , master_log_pos=475;

سپس دوباره با start slave اتصال را برقرار میکنیم.

نام فایل باینری master و position آن را همانطور که مشخص شده اضافه کردم.

در این مرحله قوانین firewall را برای پورت 3306 تنظیم کردم و بعد با استفاده از دستور show slave status از برقراری اتصال مطمئن شدم.

البته مشکلاتی در برقراری ارتباط با master به وجود آمد که دلیل آن تغییر position و شماره فایل binary در master بود که بعد متوجه شدم بهتر است از قفل کردن جداول و سپس استفاده از mysqldump و import کردن آن در گره های slave استفاده شود اما در صورت عدم سازگاری و بررسی log های mysql میتوان متوجه مشکل شد و حتی مستقیما رکورد master را برای سهولت کار تغییر داد.

تنظیم HAProxy:

در همه گره های mysql دو کاربر به نام haproxy_root و haproxy_check را که host آن ها مطابق آیپی 10.0.0.10 برای گره haproxy تنظیم شده ایجاد میکنیم و پس از نصب پکیج  روی گره ubuntu 18.04 تنظیمات خود را به فایل haproxy.cfg در دایرکتوری /etc/haproxy/ اضافه میکنیم:

frontend mysql_cluster_front

   bind 192.168.122.164:3306

   mode tcp

   option tcplog

   default_backend mysql-cluster

backend mysql-cluster

   mode tcp

   option mysql-check user haproxy_check

   balance roundrobin

   server mysql-1 10.0.0.100:3306 check

   server mysql-2 10.0.0.101:3306 check

   server mysql-3 10.0.0.102:3306 check

 

حال با استفاده از mariadb-client میتوان از هر سیستمی به virtual IP ذکر شده در بخش bind متصل شد و پرس و جو ها را اجرا کرد:

mysql -u haproxy_root -p -h 192.168.122.164