안녕하세요!

 

 

지난 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 클러스터 최적화 방법에 대해 알아보았습니다.
[Windows Server 2012 R2 MSCS 구축 - 클러스터 최적화] http://hope.pe.kr/279

 

이번 포스팅에서는 Windows Server 2012 R2에서 Failover Clustering 시 사용할수 있는 cmdlet에 대해 알아보겠습니다.

 

 

 

 

Windows Server 2012 R2 Failover Clustering Cmdlet.pdf

 

 

[참고 사이트]

Mapping Cluster.exe Commands to Windows PowerShell Cmdlets for Failover Clusters

https://technet.microsoft.com/en-us/library/ee619744(WS.10).aspx?tduid=(c4f369f3be03e4abe32318334f8666d4)(256380)(2459594)(TnL5HPStwNw-wy5OAAKn82snWN3mlbWRyA)()

 

 

먼저 Module 확인 및 가져오기 cmdlet 입니다.


다음 cmdlet으로 현재 Powershell에서 가져오기 가능한 module을 확인합니다.
Get-Module -ListAvailable

 

가져오기 가능한 Module 목록이 표시됩니다.


다음 cmdlet으로 FailoverClusters 모듈을 가져옵니다.
Import-Module FailoverClusters


바로 프롬프트가 떨어집니다.

 

 

사용 가능 cmdlet 확인 방법입니다.


다음 cmdlet으로 FailoverClusters에서 사용 가능한 cmdlet을 확인합니다.
Get-Command -Module FailoverClusters


사용 가능한 cmdlet 목록이 나타납니다.


그리고 다음 cmdlet으로 Clusters에서 사용 가능한 cmdlet을 확인합니다.
Get-Command | findstr Clusters

 

사용 가능한 cmdlet 목록이 나타납니다.

 

 

Get-ClusterGroup cmdlet 입니다.


다음 cmdlet으로 ClusterGroup 목록을 확인합니다.
Get-ClusterGroup

 

GlusterGroup의 Name, Owner, State를 확인합니다.

 

 

Stop-ClusterGroup cmdlet 입니다.


다음 cmdlet으로 “새 역할” ClusterGroup의 State를 Offline 시킬 수 있습니다.
Stop-ClusterGroup “새 역할”

 

“새 역할” ClusterGroup의 State가 Offline 되였습니다.

 

Get-ClusterGroup cmdlet으로 전체 ClusterGroup에서 “새 역할” ClusterGroup의 State가 Offline 임을 확인합니다.

 

 

Start-ClusterGroup cmdlet 입니다.


다음 cmdlet으로 “새 역할” ClusterGroup의 State 를 Online 시킵니다..
Start-ClusterGroup “새 역할”

 

“새 역할” ClusterGroup의 State가 Online 되였습니다.

 

Get-ClusterGroup cmdlet으로 전체 ClusterGroup에서 “새 역할” ClusterGroup의 State가 Online임을 확인합니다.

 


Move-ClusterGroup cmdlet 입니다.


다음 cmdlet으로 “새 역할” ClusterGroup의 Owner Node를 이동 시킬 수 있습니다.
Move-ClusterGroup “새 역할” -Node “NodeName”

 

“새 역할” ClusterGroup의 OwnerNode 가 이동 되였습니다.

 

Get-ClusterGroup cmdlet으로 전체 ClusterGroup 에서 “새 역할” ClusterGroup의 OwnerNode가 이동 되였음을 확인합니다.

 

장애 조치(Failover) 클러스터 관리자의 역할 메뉴에서 “새 역할” GlusterGroup이 다른 노드로 이동 되였음을 확인합니다.


다음 cmdlet으로 “사용 가능한 저장소” ClusterGroup의 Owner Node를 이동 시킬 수 있습니다.
Move-ClusterGroup “사용 가능한 저장소” -Node “NodeName”

 

“사용 가능한 저장소” ClusterGroup의 OwnerNode가 이동 되였습니다.

 

장애 조치(Failover) 클러스터 관리자의 디스크 메뉴에서 “Data” 디스크가 다른 노드로 이동 되였음을 확인합니다.


cf) “사용 가능한 저장소” ClusterGroup 에는 Data 디스크가 포함 되여 있음을 유추할 수 있습니다.


다음 cmdlet으로 “클러스터 그룹” ClusterGroup의 Owner Node를 이동 시킬 수 있습니다.
Move-ClusterGroup “클러스터 그룹” -Node “NodeName”

 

“클러스터 그룹” ClusterGroup의 OwnerNode가 이동 되였습니다.

 

장애 조치(Failover) 클러스터 관리자의 MSCS Name(MSCS.hope.pe.kr) 메뉴에서 현재 호스트 서버가 다른 노드로 이동 되였음을 확인합니다.

 

그리고 디스크 메뉴에서 Quorum 디스크가 다른 노드로 이동 되였음을 확인합니다.


cf) “클러스터 그룹” ClusterGroup에는 Quorum 디스크가 포함 되여 있음을 유추할 수 있습니다.

 

Move-ClusterGroup cmdlet을 이용하여 ClusterGroup을 hope-mscs1로 전부 이동 시킵니다.

 

 

Get-ClusterNode cmdlet 입니다.


다음 cmdlet으로 “hope-mscs1” ClusterNode가 OwnerNode인 ClusterGroup을 확인합니다.
Get-ClusterNode -Name hope-mscs1 | Get-ClusterGroup

 

hope-mscs1이 OwnerNode인 ClusterGroup을 확인할 수 있습니다.

 

다음 cmdlet으로 “hope-mscs2” ClusterNode가 OwnerNode인 ClusterGroup을 확인합니다.
Get-ClusterNode -Name hope-mscs2 | Get-ClusterGroup

 

“hope-mscs2” ClusterNode의 OwnerNode인 ClusterGroup이 없음을 확인합니다.

 

 

Get-ClusterResource cmdlet 입니다.


다음 cmdlet으로 ClusterResource 목록을 확인합니다.
Get-ClusterResource

 

GlusterResource의 Name, State, OwnerGroup, ResourceType을 확인합니다.


다음 cmdlet으로 “새 역할” ClusterGroup의 ClusterResource를 확인합니다.
Get-clusterGroup “새 역할” | Get-ClusterResource


 

“새 역할” ClusterGroup에는 ClusterResource가 아무것도 없습니다.

 

다음 cmdlet으로 “클러스터 그룹” ClusterGroup의 ClusterResource를 확인합니다.
Get-clusterGroup “클러스터 그룹” | Get-ClusterResource

 

"클러스터 그룹” ClusterGroup 에는 “Quoroum, 클러스터 IP 주소, 클러스터 이름” ClusterResource가 속해 있음을 확인합니다.

 

 

Get-ClusterParameter cmdlet 입니다.


다음 cmdlet으로 “Data” ClusterResource의 ClusterParameter를 확인합니다.
Get-clusterResource “Data“ | Get-ClusterParameter

 

"Data" ClusterResource의 ClusterParameter를 확인할 수 있습니다.

 

다음 cmdlet으로 “Quorum” ClusterResource의 ClusterParameter를 확인합니다.
Get-clusterResource “Quorum” | Get-ClusterParameter

 

다음 cmdlet으로 “클러스터 IP 주소” ClusterResource의 ClusterParameter를 확인합니다.
Get-clusterResource “클러스터 IP 주소” | Get-ClusterParameter

 

다음 cmdlet으로 “클러스터 이름” ClusterResource의 ClusterParameter를 확인합니다.
Get-clusterResource “클러스터 이름” | Get-ClusterParameter

 

 

 

 

이상으로 Windows Server 2012 R2 MSCS 구축 및 설정 방법에 대해 알아보았습니다.

 

 

감사합니다!

안녕하세요!

 

 

지난 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 클러스터 만들기 방법 에 대해 알아보았습니다.
[Windows Server 2012 R2 MSCS 구축 - 클러스터 만들기] http://hope.pe.kr/278

 

 

이번 포스팅에서는 Windows Server 2012 R2에서 MSCS 구축 후 클러스터 최적화 하는 방법에 대해 알아보겠습니다.

 

 

 

 

장애 조치(Failover) 클러스터 관리자 창의, 클러스터 이름에서 우클릭 후 추가 작업 - 클러스터 쿼럼 설정 구성 을 클릭 합니다.

 

클러스터 쿼럼 구성 마법사창의 시작하기 전 화면에서, 다음 을 클릭 합니다.

 

쿼럼 구성 옵션 선택 화면에서, 다음 을 클릭 합니다.

 

확인 화면에서, 다음 을 클릭 합니다.

 

요약 화면에서, 보고서 보기 를 클릭 합니다.

 

클러스터 쿼럼 설정 구성 창에서, 쿼럼 설정이 정상 완료되였음을 확인 합니다.

 

마침 을 클릭 합니다.

 

장애 조치(Failover) 클러스터 관리자 창에서, 디스크 - 클러스터 디스크 1 - 속성 을 클릭 합니다.

 

클러스터 디스크 1 속성 창에서, 이름을 사용 목적에 맞게 변경 후 확인 을 클릭 합니다.

 

클러스터 디스크 2 - 속성 을 클릭 합니다.

 

클러스터 디스크 2 속성 창에서, 이름을 사용 목적에 맞게 변경 후 확인 을 클릭 합니다.

 

장애 조치(Failover) 클러스터 관리자 창에서, 네트워크 - 클라이언트 네트워크 1 - 속성 을 클릭 합니다.

 

클라이언트 네트워크 1 속성 창에서, 이름을 사용 목적에 맞게 변경 후 확인 을 클릭 합니다.

 

클라이언트 네트워크 2 - 속성 을 클릭 합니다.

 

클라이언트 네트워크 2 속성 창에서, 이름을 사용 목적에 맞게 변경 후 확인 을 클릭 합니다.

 

장애 조치(Failover) 클러스터 관리자 창에서, 클러스터 이름 - 속성 을 클릭 합니다.

 

클러스터 이름 속성 창에서, 코어 클러스터 리소스 그룹 관리 를 클릭 합니다.

 

클러스터 그룹 속성창에서, 지정된 기간 내 최대 실패 수 값을 적절하게 증가 후 확인 을 클릭 합니다.

 

클러스터 이름 속성 창의 클러스터 사용 권한 탭에서, 추가 를 클릭 합니다.

 

사용자, 컴퓨터, 또는 그룹 선택 창에서, 추가할 개체 이름 입력 후 확인 을 클릭 합니다.

 

모든 권한 의 허용에 체크 합니다.

 

확인 을 클릭 합니다.

 

 

 

 

다음 포스팅 에서는 Windows Server 2012 R2 Failover Clustering Cmdlet 에 대해 알아보겠습니다.
[Windows Server 2012 R2 Failover Clustering Cmdlet] http://hope.pe.kr/280

 

 

감사합니다!

  1. 2018.01.30 18:14

    비밀댓글입니다

    • 2018.02.28 00:17

      비밀댓글입니다

안녕하세요!

 

 

지난 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 장애조치 클러스터 기능 설치 방법 에 대해 알아보았습니다.
[Windows Server 2012 R2 MSCS 구축 - 장애조치 클러스터 기능 설치] http://hope.pe.kr/277

 

 

이번 포스팅에서는 Windows Server 2012 R2에서 MSCS 구축 - 클러스터 만들기 방법에 대해 알아보겠습니다.

 

 

장애 조치(Failover) 클러스터 관리자 창에서, 구성 유효성 검사를 클릭합니다.

 

구성 유효성 검사 마법사 창의 시작하기 전 화면에서, 다음을 클릭합니다.

 

서버 또는 클러스터 선택 화면에서, 서버 이름 입력 후 추가를 클릭합니다.

 

다음을 클릭합니다.

 

테스트 옵션 화면에서, 다음을 클릭합니다.

 

확인 화면에서, 다음을 클릭합니다.

 

요약 화면에서, 보고서 보기를 클릭합니다.

 

장애 조치(Failove) 클러스터 유효성 검사 보고서 창에서, 범주별 결과의 설명이 성공임을 확인합니다.

 

cf) 설명이 경고여도 클러스터 만들기에는 지장이 없지만 결과 요약 페이지를 확인은 해야 합니다. 네크워크를 클릭합니다.

 

네트워크의 네트워크 통신 확인을 클릭합니다.

 

노란색으로 마킹된 부분을 확인하여 해당 이슈를 해결 하길 권장 드립니다. 아래 예제는 Public Network 만 준비되였을때 발생하는 경고 메세지 입니다.

 

쿼럼용 디스크가 준비되여 있지 않을때 발생하는 메세지입니다.

 

구성 유효성 검사 마법사 창에서, 마침을 클릭합니다.

 

클러스터 만들기 마법사 창의 시작하기 전 화면에서, 다음을 클릭합니다.

 

클러스터 관리 액세스 지점 화면에서, 클러스터 이름, IP 주소 입력 후 다음을 클릭합니다.

 

cf) 이미 사용중인 IP인 경우 다음 에러가 발생합니다.

 

확인 화면에서, 다음을 클릭합니다.

 

요약 화면에서, 보고서 보기를 클릭합니다.

 

클러스터 만들기 창에서, 클러스터 만들기가 정상적으로 진행되였음을 확인합니다.

 

마침을 클릭합니다.

 

장애 조치(Failover) 클러스터 관리자에, 새롭게 만든 클러스터 MSCS.hope.pe.kr 이 생성되였음을 확인합니다.

 

역할 메뉴 화면입니다.

 

노드 메뉴 화면입니다.

 

저장소 메뉴 화면입니다.

 

저장소 - 디스크 메뉴 화면입니다.

 

저장소 - 풀 메뉴 화면입니다.

 

네트워크 메뉴 화면입니다.

 

클러스터 이벤트 메뉴 화면입니다.

 

저장소를 소유한 노드의 파일 탐색기 화면입니다.

 

저장소를 소유하지 않은 노드의 파일 탐색기 화면입니다.

 

Active Directory 사용자 및 컴퓨터 콘솔 화면입니다.

 

DNS 관리자 콘솔 화면입니다.

 

 

 

 

다음 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 클러스터 최적화 방법에 대해 알아보겠습니다.
[Windows Server 2012 R2 MSCS 구축 - 클러스터 최적화] http://hope.pe.kr/279

 

 

감사합니다!

  1. MSCS초기구축 2018.12.13 23:47

    안녕하세요. 님의 블로그 보고 MSCS 구축 하려고 하는데 잘 안되는 부분이 있어 문의 글 남깁니다.
    우선 저의 시나리오는 아래와 같습니다.
    1. 윈서버 2012R2 AD01, AD02 설치,
    2. AD01, AD02 도메인 서비스 설치,
    - AD01을 새포리스트 wtest.com 으로 생성하고, AD02는 기존 도메인에 컨트롤러 추가
    3. AD01, AD02 mscs 계정 만들고, domain admins 그룹 추가
    4. mscs 계정으로 failover cluster 기능 추가
    5. 클러스터 만들기
    이렇게 진행을 하였습니다.
    그런데, 클러스터 만들기 부분에서 SPN 에러나 나오면서, Active Directory 구성부분에서 유효성 검사가 fail이 발생 합니다.

    혹시 wn2012R2 서버 두 도메인 컨트롤러에 failover cluster 를 할 수 없는 건가요?(MSCS 구축이 안되는 건가요?)

  2. hi 2019.08.23 12:09

    검색어 기능
    문자열에서 숫자 추출

    /**
    * 유효한 검색어 목록을 추출하는 기능
    *
    * @param inputData List 입력데이터(검색어 목록)
    * @return List 유효한 검색어
    */
    public List<String> getValidWordList(List<String> inputData) {
    List<String> validWordList = null;
    validWordList = new ArrayList<String>();
    ////////////////////////여기부터 구현 (1) ---------------->
    String num = "1234567890";

    for(String a : inputData) {

    boolean chk = false;
    String k = null;
    for(int i = 0 ;i < num.length() ; i++) {
    char t = num.charAt(i);
    k = a;
    if(a.indexOf(t) != -1) {
    System.out.println("탈락 숫자 : "+ k); // debug
    chk = true;
    break;
    }
    }
    if(!chk) {
    validWordList.add(k);
    }
    }
    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return validWordList;
    }


    /**
    * 실시간 검색어 순위 1위를 계산하는 기능
    *
    * @param validWordList List 유효한 검색어
    * @return String 실시간 검색어 순위 1위
    */
    public String getSearchWord(List<String> validWordList) {
    String searchWord = "";
    ////////////////////////여기부터 구현 (2) ---------------->
    /* Map<String, Integer> map = new HashMap<String, Integer>();
    for(String str : validWordList) {
    String key = str.toUpperCase();
    if(map.containsKey(key)) {
    int cnt = map.get(key);
    map.put(key, ++cnt);
    } else {
    map.put(key, 1);
    }
    }
    int max = 0;

    for(Iterator<String> iter = map.keySet().iterator(); iter.hasNext() ; ){
    String key = iter.next();
    int tmp = map.get(key);
    if(tmp > max) {
    max = tmp;
    searchWord = key;
    }

    }
    */


    List<String> arr = null;
    arr = new ArrayList<String>();

    String key = "";

    int index = 0;
    for(String a : validWordList) {
    key = a.toUpperCase();

    System.out.println("원본 : " + a + " 대문자 : "+ key); // debug

    if(!arr.contains(key)) {
    arr.add(key);
    }


    }



    List<String> arr2 = null;
    arr2 = new ArrayList<String>();

    for(int i = 0 ; i < arr.size(); i++ ) {
    int cnt = 0;

    String b = arr.get(i);
    arr2.add(b);

    for (int j = 0 ; j < validWordList.size();j++) {

    String c = validWordList.get(j);

    if(b.equals(c.toUpperCase() ) ) {
    cnt ++;
    }

    }
    arr2.add(Integer.toString(cnt));
    }

    //debug
    for(String ans : arr2) {
    System.out.println(" arr2 value : " + ans ); // debug
    }


    //여기까지 디버그

    int ansCnt =0 ;
    int bestCnt = 0 ;
    for(int k = 1 ; k<arr2.size(); k++) {

    int a = Integer.parseInt(arr2.get(k));

    if (a > bestCnt) {
    bestCnt = a;
    searchWord = arr2.get(k-1);
    }

    k++;
    }


    System.out.println(" bset cnt value : " + bestCnt );



    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return searchWord;
    }
    }


    =========================

    이름 변환

    public List<String> changeNotation(List<String> inputData) {
    List<String> changedList = new ArrayList<>();
    for(String name : inputData){
    String [] splitName=name.split(" ");

    //debug
    for(String abc : splitName) {
    //System.out.println("abc : "+abc);

    }

    String secondName = splitName[1].substring(0, 1).toUpperCase() + splitName[1].substring(1);
    // String thirdName = splitName[2].substring(0, 1).toLowerCase() + splitName[2].substring(1);


    String thirdName = splitName[2].toLowerCase();

    name=splitName[0]+" "+secondName+thirdName;
    changedList.add(name);
    }
    return changedList;
    }


    ======================


    숫자 체크


    ////////////////////////여기부터 구현 (1) ---------------->
    int num = (int)(Math.log10(inputData)+1);
    String input = Integer.toString(inputData);
    for(int i = 0 ; i < num ; i++) {
    checkNum += Character.getNumericValue(input.charAt(i)) * (num -i);
    }
    ///////////////////////////// <-------------- 여기까지 구현 (1)
    if(checkNum % num == 0) {
    checkNum = checkNum / num;
    } else {
    checkNum = checkNum % num;
    }
    return checkNum;
    }


    /**
    * 새로운 수를 생성하는 기능
    *
    * @param inputData int 입력데이터(숫자)
    * @param checkNum int 체크수
    * @return int 새로운 수
    */
    public int getNewNum(int inputData, int checkNum) {
    int newNum = 0;
    ////////////////////////여기부터 구현 (2) ---------------->
    int 자릿수 = (int)(Math.log10(inputData)+1);
    int 몫 = checkNum / 10;
    int 나머지 = checkNum % 10;
    if(몫 > 0) { //두자리 이상
    if(몫 > 나머지) {
    String tmp = ""+몫 + inputData + 나머지;
    newNum = Integer.parseInt(tmp);
    } else {
    String tmp = ""+나머지 + inputData + 몫;
    newNum = Integer.parseInt(tmp);
    }
    } else { // 몫이 0 -> 한자리라는 뜻
    newNum = inputData * 10 + 나머지;
    }



    ==================



    //////////////////////여기부터 구현 (1) ---------------->
    String input = ""+inputData;
    String tmp = "";
    for(int i = 0 ; i < input.length() - 1 ; i++) {
    int n1 = Character.getNumericValue(input.charAt(i));
    if(n1 == 0) n1 = 1;
    int n2 = Character.getNumericValue(input.charAt(i+1));
    if(n2 == 0) n2 = 1;
    int num = 0;
    if(n1 >= n2) {
    num = n1 / n2;
    } else {
    num = n1 % n2;
    }
    tmp+= num;
    }
    operationResult = Integer.parseInt(tmp);
    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return operationResult;
    }

    /**
    * 중복을 제거한 수를 만드는 기능
    *
    * @param operationResult int 연산 결과
    * @return int 중복을 제거한 수
    */
    public int getNumber(int operationResult){
    int number = 0;
    //////////////////////여기부터 구현 (2) ---------------->
    String tmp = ""+operationResult;
    String ret = "";
    for(int i = 0 ; i < tmp.length() ; i++) {
    char n = tmp.charAt(i);
    if(ret.indexOf(n) == -1) {
    ret += Character.getNumericValue(n);
    }
    }
    number = Integer.parseInt(ret);
    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return number;

  3. hi 2019.08.23 12:42

    1.입력으로제공되는7 ~ 9 자리숫자열을뒤에서부터3자리단위로구분하여3자리숫자로만든뒤큰순서대로정렬한다.※ 입력으로제공되는7 ~ 9 자리숫자에는숫자“0”이사용되지않는다.
    ※ 7자리또는8자리숫자인경우개수가모자란숫자뒤에1또는12를연결한다.
    [입력1] 132362289
    [뒤에서부터3자리로구분] 289 362 132
    [큰순서로정렬] 362 289 132

    [입력2] 4217836
    [뒤에서부터3자리로구분] 836 217 412 (2자리가모자라기때문에12를추가함)
    [큰순서로정렬] 836 412 217

    [입력3] 92118451
    [뒤에서부터3자리로구분] 451 118 921(1자리가모자라기때문에1을추가함)
    [큰순서로정렬] 921 451 118

    2.정렬된세수를이용하여세수의각자릿수끼리덧셈연산한결과를이용하여새로운수를만든다.
    ※ 일의자리는일의자리끼리더하고십의자리는십의자리끼리, 백의자리는백의자리끼리더한다.
    ※ 세수의각자릿수의덧셈결과가10이상이면일의자리만선택한다.
    ※ 단,백의자리연산의결과가10이되어0이선택되는경우라면새로운수생성에사용하지않는다.

    [입력1] 362 289 132
    [각자릿수끼리덧셈연산] 3+2+1=6, 6+8+3 =17, 2+9+2=13
    [결과가10이상이면일의자리숫자를선택] 6 7 3
    [새롭게생성된수] 673

    [입력2] 362 689 132
    [각자릿수끼리덧셈연산] 3+6+1=10, 6+8+3 =17, 2+9+2=13
    [결과가10이상이면일의자리숫자를선택] 0 7 3
    [새롭게생성된수] 73 -> 백의자리수연산결과0이선택된경우에는새로운수생성에사용하지않는다.


    ===
    1.입력으로제공되는7 ~ 9 자리의숫자열을이용하여“문항설명1”의세수를만들어서큰순서로정렬하는기능을구현하시오.
    2.세수를이용하여“문항설명2”의새로운수를생성하는기능을구현하시오.
    ===



    public class Calculation {


    /**
    * 세 수를 만들어서 큰 순서로 정렬하는 기능
    *
    * @param inputData String 입력데이터(숫자열)
    * @return List 정렬된 숫자열 목록
    */
    public List<String> sortNumbers(String inputData) {
    List<String> sortedNumbers = null;

    ////////////////////////여기부터 구현 (1) ---------------->

    sortedNumbers = new ArrayList<String>();

    char[] charData = inputData.toCharArray();

    int count = 0;
    int[] intNumbers = new int[3];
    for (int i = (charData.length); i >= 0; i=i-3) {
    if(i >= 3){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-3, i));
    } else if(i==2){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-2, i)+"1");
    } else if(i==1){
    intNumbers[count++] = Integer.parseInt(inputData.substring(i-1, i)+"12");
    }
    }

    Arrays.sort(intNumbers);

    for (int i = intNumbers.length-1; i >= 0; i--) {
    sortedNumbers.add(intNumbers[i]+"");
    }

    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return sortedNumbers;
    }

    /**
    * 세 수를 이용하여 새로운 수를 생성하는 기능
    *
    * @param sortedNumbers List 정렬된 숫자열 목록
    * @return int 생성된 숫자
    */
    public int generateNumber(List<String> sortedNumbers) {
    int generatedNumber = 0;
    ////////////////////////여기부터 구현 (2) ---------------->

    int[] num = {0,0,0}; // [0] 1의 자리 [1] 2의 자리 [2] 3의자리
    for (int i = 0; i < sortedNumbers.size(); i++) {
    num[2] += Integer.parseInt(sortedNumbers.get(i).substring(0, 1));
    num[1] += Integer.parseInt(sortedNumbers.get(i).substring(1, 2));
    num[0] += Integer.parseInt(sortedNumbers.get(i).substring(2, 3));
    }

    for (int i = 0; i < num.length; i++) {
    num[i] %= 10;
    generatedNumber += num[i]*Math.pow(10, i);
    }

    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return generatedNumber;
    }

    }



    ====
    ============================================


    1. 2010년부터2016년까지출생아수데이터가입력으로제공된다.
    2.출생아수가가장많은연도를검색한다.
    ※ 출생아수가동일한연도는없다.

    3.직전연도에비해출생아수가가장크게감소한연도를검색한다.
    ※ 직전연도와비교한출생아수의차가같은경우는없다.

    1.입력으로제공되는데이터를이용하여“문항설명1”에서설명한출생아수가가장많은연도를검색하는기능을구현하시오.※ 출생아수가동일한연도는없다.
    2.입력으로제공되는데이터를이용하여“문항설명2”에서설명한직전연도에비해출생아수가가장크게감소한연도를검색하는기능을구현하시오.※ 직전연도와비교한출생아수의차가같은경우는없다.

    ==
    [초기입력데이터]
    2010201120122013201420152016
    출생아수470200471300484600436500435400438400406200
    ------------------------------------------------------------
    [출생아수가가장많은연도]: 2012
    ------------------------------------------------------------
    [출생아수가가장크게감소한연도]: 2013
    ------------------------------------------------------------
    ====

    public class Statistic {

    /**
    * 출생아 수가 가장 많은 연도 검색 기능
    *
    * @param inputData int[] 입력데이터(출생아 수 데이터) ([0]:2010년, [1]:2011년, [2]:2012년, [3]:2013년, [4]:2014년, [5]:2015년, [6]:2016년)
    * @return int 출생아 수가 가장 많은 연도
    */
    public int getMaxYear(int[] inputData) {
    int maxYear = 0;
    //////////////////////// 여기부터 구현 (1) ---------------->

    int max = 0;
    for (int i = 0; i < inputData.length; i++) {
    if(max < inputData[i]) {
    max = inputData[i];
    maxYear = 2010 + i;
    }
    }

    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return maxYear;
    }

    /**
    * 출생아 수가 가장 크게 감소한 연도 검색 기능
    *
    * @param inputData int[] 입력데이터(출생아 수 데이터) ([0]:2010년, [1]:2011년, [2]:2012년, [3]:2013년, [4]:2014년, [5]:2015년, [6]:2016년)
    * @return int 출생아 수가 가장 크게 감소한 연도
    */
    public int getMaxDecreaseYear(int[] inputData) {
    int maxDecreaseYear = 0;
    //////////////////////// 여기부터 구현 (2) ---------------->

    int Decrease = inputData[1] - inputData[0];
    maxDecreaseYear = 2011;

    for (int i = 1; i < inputData.length-1; i++) {
    int temp = inputData[i+1] - inputData[i];
    if(Decrease > temp) {
    Decrease = temp;
    maxDecreaseYear = 2010 + (i+1);
    }
    }

    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return maxDecreaseYear;
    }

    }

  4. hi 2019.08.23 12:47

    1.재활용품과일반쓰레기의정보를담고있는문자열이입력으로제공된다.
    ※ 재활용품종류와일반쓰레기의표현은아래표의영문자를이용한다.
    ※ 각재활용품과일반쓰레기의양은정수이며영문자앞에1자리로표현한다. ( 1부터9까지)

    2.입력으로제공되는문자열을분석하여각재활용품의양을계산한후가장많이수거된재활용품의종류를검색한다.※ 가장많이수거된재활용품의종류가여러개이면순서에상관없이모두검색한다.

    3.입력으로제공되는문자열을이용하여재활용품과일반쓰레기를합한전체에서재활용품의백분율을계산한다.※ 재활용품의백분율계산시소수점이하버림으로처리한다.

    ===
    초기입력데이터]
    [입력문자열]: 3P4B2S4W5G2P4B2S1W4G6P5S2G4B7W2P3G8S1B6P2S
    ------------------------------------------------------------
    [가장많이수거된재활용품]: 플라스틱스티로폼
    ------------------------------------------------------------
    [재활용품의백분율]: 81
    ------------------------------------------------------------
    ====


    public class Garbage {

    /**
    * 가장 많이 수거된 재활용품의 종류 검색 기능
    *
    * @param inputData String 입력데이터(재활용품과 일반쓰레기 정보를 담고 있는 정보)
    * @return List 가장 많이 수거된 재활용품 (P:플라스틱, B:비닐, S:스티로폼, W:종이)
    */
    public List<Character> getNameList(String inputData) {
    List<Character> nameList = null;
    //////////////////////// 여기부터 구현 (1) ---------------->

    nameList = new ArrayList<Character>();

    char[] charData = inputData.toCharArray();
    HashMap<Character, Integer> NameMap = new HashMap<Character, Integer>();

    NameMap.put('P', 0);
    NameMap.put('G', 0);
    NameMap.put('B', 0);
    NameMap.put('S', 0);
    NameMap.put('W', 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int maxCount = 0;
    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount < NameMap.get(c)) {
    maxCount = NameMap.get(c);
    }
    }

    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount == NameMap.get(c)) {
    nameList.add(c);
    }
    }

    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return nameList;
    }

    /**
    * 재활용품의 백분율 계산 기능
    *
    * @param inputData String 입력데이터(재활용품과 일반쓰레기 정보를 담고 있는 정보)
    * @return int 재활용품의 백분율
    */
    public int getRatio(String inputData) {
    int ratio = 0;
    //////////////////////// 여기부터 구현 (2) ---------------->
    char[] charData = inputData.toCharArray();
    HashMap<Character, Integer> NameMap = new HashMap<Character, Integer>();

    NameMap.put('P', 0);
    NameMap.put('G', 0);
    NameMap.put('B', 0);
    NameMap.put('S', 0);
    NameMap.put('W', 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int G = 0;
    int PBSW = 0;
    for (Character c : NameMap.keySet()) {
    if(c.equals('G')) {
    G = NameMap.get(c);
    } else {
    PBSW += NameMap.get(c);
    }
    }

    ratio = (100 * PBSW) / (G + PBSW);

    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return ratio;
    }

    }1.재활용품과일반쓰레기의정보를담고있는문자열이입력으로제공된다.
    ※ 재활용품종류와일반쓰레기의표현은아래표의영문자를이용한다.
    ※ 각재활용품과일반쓰레기의양은정수이며영문자앞에1자리로표현한다. ( 1부터9까지)

    2.입력으로제공되는문자열을분석하여각재활용품의양을계산한후가장많이수거된재활용품의종류를검색한다.※ 가장많이수거된재활용품의종류가여러개이면순서에상관없이모두검색한다.

    3.입력으로제공되는문자열을이용하여재활용품과일반쓰레기를합한전체에서재활용품의백분율을계산한다.※ 재활용품의백분율계산시소수점이하버림으로처리한다.

    ===
    초기입력데이터]
    [입력문자열]: 3P4B2S4W5G2P4B2S1W4G6P5S2G4B7W2P3G8S1B6P2S
    ------------------------------------------------------------
    [가장많이수거된재활용품]: 플라스틱스티로폼
    ------------------------------------------------------------
    [재활용품의백분율]: 81
    ------------------------------------------------------------
    ====


    public class Garbage {

    /**
    * 가장 많이 수거된 재활용품의 종류 검색 기능
    *
    * @param inputData String 입력데이터(재활용품과 일반쓰레기 정보를 담고 있는 정보)
    * @return List 가장 많이 수거된 재활용품 (P:플라스틱, B:비닐, S:스티로폼, W:종이)
    */
    public List<Character> getNameList(String inputData) {
    List<Character> nameList = null;
    //////////////////////// 여기부터 구현 (1) ---------------->

    nameList = new ArrayList<Character>();

    char[] charData = inputData.toCharArray();
    HashMap<Character, Integer> NameMap = new HashMap<Character, Integer>();

    NameMap.put('P', 0);
    NameMap.put('G', 0);
    NameMap.put('B', 0);
    NameMap.put('S', 0);
    NameMap.put('W', 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int maxCount = 0;
    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount < NameMap.get(c)) {
    maxCount = NameMap.get(c);
    }
    }

    for (Character c : NameMap.keySet()) {
    if(!c.equals('G') && maxCount == NameMap.get(c)) {
    nameList.add(c);
    }
    }

    ///////////////////////////// <-------------- 여기까지 구현 (1)
    return nameList;
    }

    /**
    * 재활용품의 백분율 계산 기능
    *
    * @param inputData String 입력데이터(재활용품과 일반쓰레기 정보를 담고 있는 정보)
    * @return int 재활용품의 백분율
    */
    public int getRatio(String inputData) {
    int ratio = 0;
    //////////////////////// 여기부터 구현 (2) ---------------->
    char[] charData = inputData.toCharArray();
    HashMap<Character, Integer> NameMap = new HashMap<Character, Integer>();

    NameMap.put('P', 0);
    NameMap.put('G', 0);
    NameMap.put('B', 0);
    NameMap.put('S', 0);
    NameMap.put('W', 0);

    for (int i = 0; i < charData.length-1; i=i+2) {
    int tempCount = (int) NameMap.get((Character)charData[i+1]) + Integer.parseInt(charData[i]+"");
    NameMap.put(charData[i+1], tempCount);
    }

    int G = 0;
    int PBSW = 0;
    for (Character c : NameMap.keySet()) {
    if(c.equals('G')) {
    G = NameMap.get(c);
    } else {
    PBSW += NameMap.get(c);
    }
    }

    ratio = (100 * PBSW) / (G + PBSW);

    ///////////////////////////// <-------------- 여기까지 구현 (2)
    return ratio;
    }

    }

안녕하세요!

 

 

지난 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 사전 준비 방법 에 대해 알아보았습니다.
[Windows Server 2012 R2 MSCS 구축 - 사전 준비] http://hope.pe.kr/276

 

 

이번 포스팅에서는 Windows Server 2012 R2에서 MSCS 구축 시 장애조치 클러스터 기능 설치 방법에 대해 알아보겠습니다.

 

 

 

 

실행(윈도우 Key+R Key)창에서, servermanager.exe 입력 후 확인을 클릭합니다.

 

서버 관리자 창에서, 역할 및 기능 추가를 클릭합니다.

 

시작하기 전 화면에서, 다음을 클릭합니다.

 

설치 유형 선택 화면에서, 다음을 클릭합니다.

 

대상 서버 선택 화면에서, 다음을 클릭합니다.

 

서버 역할 선택 화면에서, 다음을 클릭합니다.

 

기능 선택 화면에서, 장애 조치(failover) 클러스터링에 체크합니다.

 

역할 및 기능 추가 마법사 창에서, 기능 추가를 클릭 합니다.

 

다음을 클릭합니다.

 

설치 선택 확인 화면에서, 설치를 클릭합니다.

 

설치 진행률 화면에서, 닫기를 클릭합니다.

 

시작 화면에서, 화살표 버튼을 클릭합니다.

 

앱 화면에서, 장애 조치(failover) 클러스터 관리자를 클릭합니다.

 

또는 실행(Windows Key+R Key)에서, cluadmin.msc 입력 후 확인을 클릭합니다.

 

장채 조치(failover) 클러스터 관리자 창이 실행됩니다.

 

 

 

 

다음 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 클러스터 만들기 방법에 대해 알아보겠습니다.
[Windows Server 2012 R2 MSCS 구축 - 클러스터 만들기] http://hope.pe.kr/278

 

 

감사합니다!

안녕하세요!

 

 

지난 포스팅 에서는 Windows Server 2012 R2 iSCSI 가상 디스크 연결하기 방법에 대해 알아보았습니다.
[Windows Server 2012 R2 iSCSI 가상 디스크 연결하기] http://hope.pe.kr/275

 

 

이번 포스팅에서는 Windows Server 2012 R2에서 MSCS 구축 시 사전 준비에 대해 알아보겠습니다.

 

 

cf) 지난 "Windows Server 2008 R2 에서 MSCS (Microsoft Cluster Service) 설치 및 구성(http://hope.pe.kr/197)" 포스팅과 많은 내용이 비슷합니다. 참고 하시면 좋을 것 같습니다.

 

 

먼저 사전 준비 사항 입니다.

 

MSCS 구축 계정은 Domain Admins 그룹의 구성원이여야 합니다.

 

Node는 도메인의 멤버 서버여야 합니다.

 

Node의 NIC는 Public Network와 Private Network 용도로 2개 이상이여야 합니다.

 

Public NIC의 속성 창입니다. 공인 IP, 게이트웨이, DNS 서버가 모두 입력 되여있어야 합니다.

 

Private NIC의 속성 창입니다. 사설 IP만 입력 되여 있으면 됩니다. 고급 창을 클릭 합니다.

 

고급 TCP/IP 설정 창에서, DNS 탭에서 DNS에 이 연결의 주소를 등록에 체크를 해제 합니다.

 

WINS 탭에서, NetBIOS over TCP/IP 사용 안함을 선택합니다.

 

고급(ALT키) - 고급 설정을 클릭 합니다.

 

고급 설정창에서, Private NIC의 Microsoft 네트워크용 파일 및 프린터 공유는 체크 해제합니다.

 

Public NIC의 우선 순위를 가장 높게 설정합니다.

 

 

 

 

다음 포스팅 에서는 Windows Server 2012 R2 MSCS 구축 - 장애조치 클러스터 기능 설치 방법에 대해 알아보겠습니다.
[Windows Server 2012 R2 MSCS 구축 - 장애조치 클러스터 기능 설치] http://hope.pe.kr/277

 

 

감사합니다!

+ Recent posts