ABOUT ME

Today
Yesterday
Total
  • ubuntu proxy ochestrator 활용
    카테고리 없음 2023. 8. 30. 11:45
    hostnamectl set-hostname ubuntu
    apt-get update -y && apt-get dist-upgrade -y
    apt-get install curl -y && apt-get install mysql-client -y
    curl -fsSL https://get.docker.com -o get-docker.sh
    chmod +x get-docker.sh
    ./get-docker.sh
    usermod -aG docker ubuntu
    mkdir dockerdir
    cd dockerdir

     

     

    curl

    커맨드 라인에서 다양한 프로토콜을 통해 데이터를 전송하거나 받을 수 있는 도구입니다. 주로 HTTP, HTTPS, FTP 등과 같은 프로토콜을 사용하여 웹 서버나 다른 리소스와 상호 작용할 때 유용하게 사용됩니다.

     

    curl의 옵션
    • -X: HTTP 요청 메서드를 지정합니다. 예를 들어, -X GET 또는 -X POST와 같이 사용합니다.
    • -H: HTTP 헤더를 추가합니다. 예를 들어, -H "Content-Type: application/json"와 같이 사용합니다.
    • -d: POST 요청 시에 전송할 데이터를 지정합니다.
    • -o: 다운로드한 데이터를 특정 파일로 저장합니다.
    • -O: URL에서 파일명을 추출하여 해당 파일명으로 저장합니다.
    • -i: 서버 응답 헤더를 출력합니다.
    • -s: 정적 데이터를 화면에 표시하지 않고 에러 메시지만 출력합니다.
    • --insecure: SSL 인증서 검증을 무시하고 접속합니다 (보안상 권장되지 않음).
    • -A: 사용자 에이전트(브라우저 등)를 지정합니다.
    • -L: 리다이렉션을 따라갑니다.

      사용 예시
      1. URL에서 데이터를 가져오기: curl https://www.example.com
      2. POST 요청 보내기: curl -X POST -d "key=value" https://www.example.com/api
      3. 다운로드: curl -o filename.jpg https://www.example.com/image.jpg

     

     

     

    docker restart 
    docker stop[start]
    docker rm 
    docker run 
    docker top[stats] db001

    - 기본 폴더와 권한 부여 ---

    mkdir -p /db/db001/data /db/db001/log /db/db001/conf
    chmod 777 /db/db001/data /db/db001/log /db/db001/conf

    mkdir -p /db/db002/data /db/db002/log /db/db002/conf
    chmod 777 /db/db002/data /db/db002/log /db/db002/conf

    mkdir -p /db/db003/data /db/db003/log /db/db003/conf
    chmod 777 /db/db003/data /db/db003/log /db/db003/conf

    touch /db/db001/conf/my.cnf
    chmod 644 /db/db001/conf/my.cnf

    touch /db/db002/conf/my.cnf
    chmod 644 /db/db002/conf/my.cnf

    touch /db/db003/conf/my.cnf
    chmod 644 /db/db003/conf/my.cnf
    [mysqld]
    log_bin                     = mysql-bin
    binlog_format               = ROW
    gtid_mode                   = ON
    enforce-gtid-consistency    = true
    server-id                   = 100  --> 200 / 300
    log_slave_updates
    datadir                     = /var/lib/mysql
    socket                      = /var/lib/mysql/mysql.sock
    read_only   ----> db002, db003 
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links              = 0
    
    log-error                   = /var/log/mysql/mysqld.log
    pid-file                    = /var/run/mysqld/mysqld.pid
    
    report_host                 = db001  --> db002 / db003
    
    [mysqld_safe]
    pid-file                    = /var/run/mysqld/mysqld.pid
    socket                      = /var/lib/mysql/mysql.sock
    nice                        = 0

     

    === 실습 ====

    docker network create --driver bridge mybridge

    docker run -it --name db001 -h db001 -p 3306:3306 \
    --net mybridge --net-alias=db001 \
    -v /db/db001/data:/var/lib/mysql \
    -v /db/db001/log:/var/log/mysql \
    -v /db/db001/conf:/etc/percona-server.conf.d \
    -e MYSQL_ROOT_PASSWORD="12345" -d percona:5.7.30

    docker run -it --name db002 -h db002 -p 3307:3306 \
    --net mybridge --net-alias=db002 \
    -v /db/db002/data:/var/lib/mysql \
    -v /db/db002/log:/var/log/mysql \
    -v /db/db002/conf:/etc/percona-server.conf.d \
    -e MYSQL_ROOT_PASSWORD="12345" -d percona:5.7.30  

    docker run -it --name db003 -h db003 -p 3308:3306 \
    --net mybridge --net-alias=db003 \
    -v /db/db003/data:/var/lib/mysql \
    -v /db/db003/log:/var/log/mysql \
    -v /db/db003/conf:/etc/percona-server.conf.d \
    -e MYSQL_ROOT_PASSWORD="12345" -d percona:5.7.30 

    master에서 복제에 사용할 유저 생성, 권한 부여
    docker exec -it -uroot db001 /bin/bash
    mysql -uroot -p12345
    create user 'repl'@'%' identified by '12345';
    grant replication slave on *.* to 'repl'@'%';
    flush privileges;

    slave 컨테이너에 접속해서 master서버로 연결되도록 복제 구성 -> 복제 start 

    docker exec -it -uroot db002 /bin/bash
    mysql -uroot -p12345
    reset master;
    change master to master_host='db001', master_user='repl', master_password='12345', master_auto_position=1;
    start slave;
    show slave status\G    ---> 복제 구성 확인 하기 

    docker exec -it -uroot db003 /bin/bash
    mysql -uroot -p12345
    reset master;
    change master to master_host='db001', master_user='repl', master_password='12345', master_auto_position=1;
    start slave;
    show slave status\G    ---> 복제 구성 확인 하기 



    orchestrator 

    docker run -it --name orchestrator -h orchestrator \
    --net mybridge --net-alias=orchestrator \
    -p 3000:3000 -d openarkcode/orchestrator:latest

    docker ps 
    docker inspect db001 | grep "IPAddress"

    orchestrator가 사용할 db유저, 권한 생성
    docker exec -it -uroot db001 /bin/bash
    mysql -uroot -p12345
    create user 'orc_client_user'@'172.%' identified by 'orc_client_password';
    grant super, process, replication slave, reload on *.* to 'orc_client_user'@'172.%';
    grant select on mysql.slave_master_info to 'orc_client_user'@'172.%';
    flush privileges;

    https://blog.yannickjaquier.com/mysql/orchestrator-tutorial.html

     참조 사이트 

     

    Orchestrator MySQL replication topology tool tutorial

    How to setup Orchestrator to graphically manage and visualize any complex MySQL or MariaDB replication topology

    blog.yannickjaquier.com

     

    ip addr | grep docker0 
    우분투 파이폭스 172.17.0.1:3000/web/discover

    proxysql

    mkdir -p /db/proxysql/data /db/proxysql/conf
    chmod 777 /db/proxysql /db/proxysql/data /db/proxysql/conf

    touch /db/proxysql/conf/proxysql.cnf
    chmod 644 /db/proxysql/conf/proxysql.cnf
    nano /db/proxysql/conf/proxysql.cnf

     

    datadir="/var/lib/proxysql"
    admin_variables=
    {
    admin_credentials="admin:admin;radmin:radmin"
    mysql_ifaces="0.0.0.0:6032"
    }
    mysql_variables=
    {
    threads=4
    max_connections=2048
    default_query_delay=0
    default_query_timeout=36000000
    have_compress=true
    poll_timeout=2000
    interfaces="0.0.0.0:6033"
    default_schema="information_schema"
    stacksize=1048576
    server_version="5.5.30"
    connect_timeout_server=3000
    monitor_username="monitor"
    monitor_password="monitor"
    monitor_history=600000
    monitor_connect_interval=60000
    monitor_ping_interval=10000
    monitor_read_only_interval=1500
    monitor_read_only_timeout=500
    ping_interval_server_msec=120000
    ping_timeout_server=500
    commands_stats=true
    sessions_sort=true
    connect_retries_on_failure=10
    }

     

    docker run -it --name proxysql -h proxysql -p 16032:6032 -p 16033:6033 \
    --net mybridge --net-alias=proxysql \
    -v /db/proxysql/data:/var/lib/proxysql \
    -v /db/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf \
    -d proxysql/proxysql

     

     

     

    docker exec -it -uroot db001 /bin/bash
    mysql -uroot -p12345
     
    create database testdb default character set utf8;
     
    create user 'appuser'@'%' identified by '12345';
    grant select, insert, update, delete on testdb.* to 'appuser'@'%';

    create user 'monitor'@'%' identified by 'monitor';
    grant replication client on *.* to 'monitor'@'%';


    flush privileges;

     

    • hostgroup 10번, hostgroup 20번 2개 등록
    • hostgroup 10번 : write용 transaction 처리 -> db001 등록
      hostgroup 20번 : read용 transaction 처리 -> db001 2 3

     

    mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"
    insert into mysql_servers(hostgroup_id, hostname, port) values(10, 'db001', 3306);

    insert into mysql_servers(hostgroup_id, hostname, port) values(20, 'db001', 3306);
    insert into mysql_servers(hostgroup_id, hostname, port) values(20, 'db002', 3306);
    insert into mysql_servers(hostgroup_id, hostname, port) values(20, 'db003', 3306);

    insert into mysql_replication_hostgroups values(10, 20 ,'read_only','');
    load mysql servers to runtime;  --> 적용 
    save mysql servers to disk;  --> 영구저장 

    insert into mysql_users(username, password, default_hostgroup, transaction_persistent) values('appuser', '12345', 10, 0);
    load mysql servers to runtime;  --> 적용 
    save mysql servers to disk;  --> 영구저장 

    proxy서버가 app서버로 부터 받은 쿼리를 sql서버로 분기시켜줄 룰 생성

    insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup) values(1,1,'^select.*for update$',10);
    insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup) values(2,1,'^select',20);


    load mysql query rules to runtime;  --> 적용
    save mysql query rules to disk;  --> 영구저장 

     

Designed by Tistory.