기존 8G 메모리, 1T 하드디스크로 서버가 구성되었다고 한다면 메모리: 8G-> 16G, 하드디스크 1T-> 10T 로 하드웨어 사양을 업그레이드 하는것을 스케일 업이라고하며 ,서버의 사양을 높이는 것이기 때문에 수직 스케일링(vertical scaling) 이라고도 한다.
scale-up
스케일 아웃(Scale-Out) ?
서버의 자원 사용량이 부족하여 비슷한 사양의 서버를 추가하는 작업을 말한다.
하나의 장비에서 서비스를 처리함에 있어 한계에 부딪힐 경우 비슷한 스펙의 서버를 추가함으로 서버의 부하를 분산하는데 목적이 있다.
scale-out
스케일 인(Scale-In) ?
스케일 아웃과 반대되는 개념으로서 스케일 인 작업은 서버 용량 부족으로 늘렸던 자원을 다시 회수 하는 작업을 의미한다. 서비스 사용량이 줄어 늘려놓았던 불필요한 서버 자원을 해제 하는 작업을 의미한다.
scale-in
오토스케일(Auto-Scale)?
서비스 사용량에 따라서 스케일 인/ 스케일 아웃 작업을 알아서 자동으로 해주는 작업을 말합니다.
root@ubuntu2004:~# tail -f /var/log/gitlab/gitlab-rails/production.log Completed 200 OK in 34ms (Views: 0.5ms | ActiveRecord: 0.0ms | Elasticsearch: 0.0ms | Allocations: 814) Started GET "/api/v4/geo/proxy" for 127.0.0.1 at 2022-04-16 12:36:37 +0900 Started GET "/-/metrics" for 127.0.0.1 at 2022-04-16 12:36:44 +0900 Processing by MetricsController#index as HTML Completed 200 OK in 33ms (Views: 0.4ms | ActiveRecord: 0.0ms | Elasticsearch: 0.0ms | Allocations: 814) Started GET "/api/v4/geo/proxy" for 127.0.0.1 at 2022-04-16 12:36:47 +0900 Started GET "/api/v4/geo/proxy" for 127.0.0.1 at 2022-04-16 12:36:57 +0900 Started GET "/-/metrics" for 127.0.0.1 at 2022-04-16 12:36:59 +0900 Processing by MetricsController#index as HTML Completed 200 OK in 32ms (Views: 0.4ms | ActiveRecord: 0.0ms | Elasticsearch: 0.0ms | Allocations: 814) Started GET "/api/v4/geo/proxy" for 127.0.0.1 at 2022-04-16 12:37:07 +0900 Started GET "/-/metrics" for 127.0.0.1 at 2022-04-16 12:37:14 +0900 Processing by MetricsController#index as HTML Completed 200 OK in 36ms (Views: 0.5ms | ActiveRecord: 0.0ms | Elasticsearch: 0.0ms | Allocations: 814)
gitlab 서비스 로그 확인
gitlab-ctl tail 명령을 통해 gitlab 서버에서 남기는 각종 로그를 확인할수 있습니다.
STS 란 Spring Tool Suit 약어 이며 , Spring FrameWork 을 지원하기 위해 최적화 된 IDE 개발 툴입니다. 기존에 이클립스(Eclipse) 기반 환경에서 웹서비스를 개발 하기 위해서는 개발에 필요한 여러가지 필수 플러그인을 별도로 설치해야 했습니다. STS 는 Eclipse 환경에서는 기본 설치 되지 않은 내장 톰켓 서버나 , 빌드툴( gradle,maven) ,git 등이 기본으로 플러그인에 포함되어있어 보다 쉽고 간편하게 웹서비스를 개발 할수 있도록 도와주는 고마운 툴입니다.
STS 다운로드
필자는 우분투 환경이라 리눅스 버전을 다운로드 받아 설치 하는 방법에 대해 소개 하겠습니다.
spring.io 사이트에서 리눅스 버전을 다운로드 받습니다.
다운로드 받은 파일을 압축 해제 합니다.
tar xvzf spring-tool-suite-4-4.14.0.RELEASE-e4.23.0-linux.gtk.x86_64.tar.gz
dev@ubuntu2004:~/STS/sts-4.14.0.RELEASE$ ll 합계 1328 drwxr-xr-x 9 dev dev 4096 3월 14 01:20 ./ drwxrwxr-x 3 dev dev 4096 4월 16 22:32 ../ -rw-r--r-- 1 dev dev 61 3월 9 01:22 .eclipseproduct drwxr-xr-x 2 dev dev 4096 3월 14 01:18 META-INF/ -rwxr-xr-x 1 dev dev 86328 3월 14 01:16 SpringToolSuite4* -rw-r--r-- 1 dev dev 681 3월 14 01:20 SpringToolSuite4.ini -rw-r--r-- 1 dev dev 160278 3월 14 01:20 artifacts.xml drwxr-xr-x 5 dev dev 4096 3월 14 01:18 configuration/ drwxr-xr-x 2 dev dev 4096 3월 14 01:18 dropins/ drwxr-xr-x 72 dev dev 12288 3월 14 01:20 features/ -rwxr-xr-x 1 dev dev 136129 3월 14 01:16 icon.xpm* -rw-r--r-- 1 dev dev 11522 3월 14 01:12 license.txt -rw-r--r-- 1 dev dev 845709 3월 14 01:20 open-source-licenses.txt drwxr-xr-x 5 dev dev 4096 3월 14 01:19 p2/ drwxr-xr-x 24 dev dev 53248 3월 14 01:20 plugins/ drwxr-xr-x 2 dev dev 4096 3월 14 01:18 readme/
jmeter@ubuntu2004:~$ java -version openjdk version "1.8.0_312" OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode) jmeter@ubuntu2004:~$ javac -version javac 1.8.0_312
JMeter 실행
다운로드 바이너리 바일 압축 해제
jemeter.sh 실행
jmeter@ubuntu2004:~$ tar xvzf apache-jmeter-5.4.3.tgz jmeter@ubuntu2004:~$ cd apache-jmeter-5.4.3/bin jmeter@ubuntu2004:~/apache-jmeter-5.4.3/bin$ sh jmeter.sh
JMeter 부하 테스트
JDBC 로 오라클 Database 접속 하여 DML 부하 테스트 하는 방법에 대해 알아보겠습니다.
Thread Group 생성
File ->New 버튼을 눌러 테스트 계획을 만듭니다.
Test Plan 우클릭 버튼을 눌러 쓰레드 그룹을 만듭니다.
Jdbc Connection Configuration 생성
설정 내용
Name :커넥션 명을 작성 한다.
Variable Name for create pool : 실제 테스트시 사용할 Connection pool 명이다 .
Database URL : 오라클 접속 URL jdbc:oracle:thin:@116.121.154.196:1521:ORCLCDB
JDBC Driver Class :오라클 jdbc 드라이버 클래스 명을 선택 한다.
UserName : 접속할 테스트 계정이다 .
Password :접속할 테스트 계정의 비밀번호 이다.
테스트 결과 Report 생성
Test Plan ->Add ->Listener 선택후 확인하고자 하는 결과 리포팅 추가 작업
pip list 명령을 통해 설치된 버전 확인 (pip 를 통해 파이썬에서 필요로 하는 팩키지를 설치할수 있습니다.)
(py27) [testuser1@centos7:/home/testuser1/venv]$ python -V Python 2.7.5 (py27) [testuser1@centos7:/home/testuser1/venv]$ pip --version pip 20.3.4 from /home/testuser1/venv/py27/lib/python2.7/site-packages/pip (python 2.7) (py27) [testuser1@centos7:/home/testuser1/venv]$ pip list DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality. Package Version ---------- ------- pip 20.3.4 setuptools 44.1.1 wheel 0.37.1
PyCharm 을 실행후 File -> open -> DjangoSample 프로젝트를 오픈합니다.
파이썬 가상 환경 생성
파이썬 가상 환경은 파이썬 프로젝트를 진행할 때 독립된 환경을 제공해주는 도구 입니다.
각각의 어플리케이션마다 구동 환경이 다를 경우 별도의 환경을 개별 적으로 만들어 줄수 있습니다. 예를 들어 첫번째 어플리케이션은 파이썬 2.7 버전 + Django3.x 환경으로 구성하고 두번째 어플리케이션은 파이썬 3.7 버전 + Django4.x 버전으로 환경으로 독립적으로 구성해서 개발을 진행 할수 있습니다.
app1 : venv1(파이썬 2.7 버전 + Django3.x)
app2 : venv2(파이썬 3.7 버전 + Django4.x )
가상환경을 만드는 방법에 대해 알아보겠습니다.
파이참을 실행하면 화면 하단에 Terminal 이란 창이 있습니다.
해당 창은 윈도우 CMD 창에서 작업을 진행 하는 내용과 동일 하게 수행 할수 있는 기능 입니다.
D:\ 에 가상환경을 만들어 보겠습니다.
python -m venv samples 명령을 통해 가상 환경을 만듭니다.
cd D:\
mkdir venvs
cd venvs
python -m venv samples
python -m venvsamples 수행 후 samples 라는 디렉 토리가 생기고 samples 디렉토리 내에는 가상화 할수 있는 환경 파일들이 추가 생성 되게 됩니다.
activate 명령을 통해 가상환경에 진입합니다. 반대로 빠져 나오고자 할때는 deactivate 명령을 수행 합니다.
(samples) D:\TestLink-django\DjangoSample>python manage.py runserver Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "D:\venvs\samples\lib\site-packages\django\db\utils.py", line 110, in load_backend return import_module('%s.base' % backend_name) File "C:\Users\jungki\AppData\Local\Programs\Python\Python37\lib\importlib\__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked ModuleNotFoundError: No module named 'django.db.backends.tibero'
.................... .............. ........... 중략 ........... ........... class AbstractBaseUser(models.Model): File "D:\venvs\samples\lib\site-packages\django\db\models\base.py", line 117, in __new__ new_class.add_to_class('_meta', Options(meta, app_label)) File "D:\venvs\samples\lib\site-packages\django\db\models\base.py", line 321, in add_to_class value.contribute_to_class(cls, name) File "D:\venvs\samples\lib\site-packages\django\db\models\options.py", line 204, in contribute_to_class self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) File "D:\venvs\samples\lib\site-packages\django\db\__init__.py", line 28, in __getattr__ return getattr(connections[DEFAULT_DB_ALIAS], item) File "D:\venvs\samples\lib\site-packages\django\db\utils.py", line 201, in __getitem__ backend = load_backend(db['ENGINE']) File "D:\venvs\samples\lib\site-packages\django\db\utils.py", line 125, in load_backend ) from e_user django.core.exceptions.ImproperlyConfigured: 'django.db.backends.tibero' isn't an available database backend. Try using 'django.db.backends.XXX', where XXX is one of: 'mysql', 'oracle', 'postgresql', 'sqlite3'
Starting development server at http://127.0.0.1:8000/ 라는 메시지가 나오면 정상 적으로 어플리케이션이 구동한 상태입니다.
웹에서 http://127.0.0.1:8000/admin 접속 합니다.
에러가 발생 할 것입니다.
Django FrameWork 에서 사용 되는 Table 들이 없어서 발생하는 문제입니다.
어플리케이션 수행시 (python manage.py runserver ) 내용을 좀더 자세히 보겠습니다.
친절하게 python manage.py migrate 수행하라고 설명해 주고 있습니다.
(samples) D:\TestLink-django\dqaDjangoSample>python manage.py runserver Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, polls, sessions. Run 'python manage.py migrate' to apply them. April 06, 2022 - 20:38:15
python manage.py migrate 수행
해당 명령을 수행하면 django framework 에서 필요로 하는 여러 테이블들을 Tibero 서버에 자동으로 생성을 해주게 됩니다.
(samples) D:\TestLink-django\dqaDjangoSample>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying polls.0001_initial... OK Applying sessions.0001_initial... OK
Tibero 계정 생성된 테이블 확인
SQL> ls
NAME SUBNAME TYPE ---------------------------------- ------------------------ -------------------- AUTH_GROUP_GROUP_ID_B120CBF9 INDEX AUTH_GROUP_PERMISSION_84C5C92E INDEX AUTH_GROU_GROUP_ID__0CD325B0_U INDEX AUTH_PERMI_CONTENT_TY_2F476E4B INDEX AUTH_PERM_CONTENT_T_01AB375A_U INDEX AUTH_USER_USER_ID_G_94350C0C_U INDEX AUTH_USER_USER_ID_P_14A6B632_U INDEX AUTH_USER__GROUP_ID_97559544 INDEX AUTH_USER__PERMISSION_1FBB5F2C INDEX AUTH_USER__USER_ID_6A12ED8B INDEX AUTH_USER__USER_ID_A95EAD1B INDEX DJANGO_ADM_CONTENT_TY_C4BCE8EB INDEX DJANGO_ADM_USER_ID_C564EBA6 INDEX DJANGO_CO_APP_LABEL_76BD3D3B_U INDEX DJANGO_SES_EXPIRE_DAT_A5C62663 INDEX POLLS_CHOI_QUESTION_I_C5B4B260 INDEX _TIBERO_CON58500778 INDEX _TIBERO_CON58800226 INDEX _TIBERO_CON59100508 INDEX _TIBERO_CON59400665 INDEX _TIBERO_CON59500888 INDEX _TIBERO_CON59700316 INDEX _TIBERO_CON60100546 INDEX _TIBERO_CON60500165 INDEX _TIBERO_CON61200100 INDEX _TIBERO_CON61600781 INDEX _TIBERO_CON63100670 INDEX _TIBERO_CON63900727 INDEX _TIBERO_CON64200758 INDEX _TIBERO_CON64700708 INDEX _TIBERO_LIDX344900 INDEX _TIBERO_LIDX345100 INDEX _TIBERO_LIDX346800 INDEX AUTH_GROUP_PERMISSIONS_SQ SEQUENCE AUTH_GROUP_SQ SEQUENCE AUTH_PERMISSION_SQ SEQUENCE AUTH_USER_GROUPS_SQ SEQUENCE AUTH_USER_SQ SEQUENCE AUTH_USER_USER_PERMISSIONS_SQ SEQUENCE DJANGO_ADMIN_LOG_SQ SEQUENCE DJANGO_CONTENT_TYPE_SQ SEQUENCE DJANGO_MIGRATIONS_SQ SEQUENCE POLLS_CHOICE_SQ SEQUENCE POLLS_QUESTION_SQ SEQUENCE AUTH_GROUP TABLE AUTH_GROUP_PERMISSIONS TABLE AUTH_PERMISSION TABLE AUTH_USER TABLE AUTH_USER_GROUPS TABLE AUTH_USER_USER_PERMISSIONS TABLE DJANGO_ADMIN_LOG TABLE DJANGO_CONTENT_TYPE TABLE DJANGO_MIGRATIONS TABLE DJANGO_SESSION TABLE POLLS_CHOICE TABLE POLLS_QUESTION TABLE AUTH_GROUP_PERMISSIONS_TR TRIGGER AUTH_GROUP_TR TRIGGER AUTH_PERMISSION_TR TRIGGER AUTH_USER_GROUPS_TR TRIGGER AUTH_USER_TR TRIGGER AUTH_USER_USER_PERMISSIONS_TR TRIGGER DJANGO_ADMIN_LOG_TR TRIGGER DJANGO_CONTENT_TYPE_TR TRIGGER DJANGO_MIGRATIONS_TR TRIGGER POLLS_CHOICE_TR TRIGGER POLLS_QUESTION_TR TRIGGER
Django admin(테스트 계정 생성)
Django admin 에 접속 하려면 user 를 만들어 줘야 합니다.
admin 유저를 생성 하겠습니다.
python manage.py createsuperuser 명령을 통해 admin 유저의 계정과 비번을 생성 하겠습니다.
testuser1 이라는 계정을 만들겠습니다.
(samples) D:\TestLink-django\dqaDjangoSample>python manage.py createsuperuser Username (leave blank to use ''): testuser1 Email address: testuser1@example.com Password: Password (again): Superuser created successfully.
생성된 user 로 접속 - URL (http://127.0.0.1:8000/admin)
user 미생성 시 접속 불가
user 생성후 접속
Django Admin 설문 작성(Polls) 테스트
Questions: 설문지 제목
Choices : 설문지 선택 내용 작성
Questions 버튼을 눌러서 설문할 주제를 작성합니다.
Choices 버튼을 눌러서 선택지를 작성합니다
테스를 위해 3개은 선택지를 만들었습니다.
설문 작성이 완료 되었고 이제 설문 페이지에 접속 해서 등록된 내용이 잘 나오는지 확인해 보겠습니다.
(djangoenv) [django@centos7:/home/django/venvs]$ python manage.py runserver 0.0.0.0:8000 Watching for file changes with StatReloader Performing system checks...
System check identified no issues (0 silenced). April 08, 2022 - 07:53:32 Django version 2.2.24, using settings 'dqaDjangoSample.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C. [08/Apr/2022 07:53:34] "GET /admin/ HTTP/1.1" 200 7031 [08/Apr/2022 07:53:35] "GET /static/admin/css/responsive.css HTTP/1.1" 200 17944 [08/Apr/2022 07:53:35] "GET /static/admin/css/base.css HTTP/1.1" 200 16378 [08/Apr/2022 07:53:35] "GET /static/admin/css/dashboard.css HTTP/1.1" 200 412 [08/Apr/2022 07:53:35] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423 [08/Apr/2022 07:53:35] "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392 [08/Apr/2022 07:53:35] "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 [08/Apr/2022 07:53:35] "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380 [08/Apr/2022 07:53:35] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692 [08/Apr/2022 07:53:35] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184 [08/Apr/2022 07:53:35] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876